【问题标题】:Parsing JTS Geometry to GeoGSON with RESTEasy / Jackson / Quarkus使用 RESTEasy / Jackson / Quarkus 将 JTS 几何解析为 GeoGSON
【发布时间】:2021-05-09 14:23:14
【问题描述】:

我正在尝试将旧的 EJB 服务(内部逻辑)包装在微服务中。我使用 Quarkus / RESTEasy 来实现这个微服务

但是,我在自定义序列化/反序列化时遇到了问题。

问题:Cannot construct instance of com.vividsolutions.jts.geom.Geometry 这让我相信 Jackson 并没有将 Geometry 视为要解析的类,而是一个字符串。这让我相信对象映射器没有被拾取..

注意1:我可以在Quarkus日志中提供的日志语句中看到:customizing ObjectMapper, adding geometry serializer / deserializer

注意 2:单元测试在 RegisterGeometryMapper 上运行良好。

这是我要解析的 JSON(注意:几何是 GeoGSON)

{
  "geometry": {
    "type": "Point",
    "coordinates": [
      134750,
      477800,
      3.18
    ],
    "crs": {
      "type": "name",
      "properties": {
        "name": "EPSG:28992"
      }
    }
  },
  "date": 1612519294297
}

这是 REST 资源方法:

    @POST
    @Path( "/etrs89-transformation" )
    @Consumes( MediaType.APPLICATION_JSON )
    @Produces( MediaType.APPLICATION_JSON )
    TransformationResult transformToEtrs89(@NotNull @Valid TransformationRequest request);

及其请求 DTO:

public class TransformationRequest {
    @NotNull private Geometry geometry;
    private Date date;
}

这是我注册的映射器。

@Singleton
public class RegisterGeometryMapper implements ObjectMapperCustomizer {

    private static final Logger LOG = Logger.getLogger( RegisterGeometryMapper .class );

    public void customize(ObjectMapper mapper) {
        LOG.debug( "customizing ObjectMapper, adding geometry serializer / deserializer." );
        SimpleModule module = new SimpleModule();
        module.addDeserializer( Geometry.class, new GeometryDeserializer() );
        module.addSerializer( Geometry.class, new GeometrySerializer() );
        mapper.registerModule( module );
    }

    public static class GeometryDeserializer extends StdDeserializer<Geometry> {

        private final GeoJsonReader reader = new GeoJsonReader();

        public GeometryDeserializer() {
            this( Geometry.class );
        }

        public GeometryDeserializer(Class<Geometry> vc) {
            super( vc );
        }

        @Override
        public Geometry deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
            JsonNode node = jp.getCodec().readTree( jp );
            String geoGson = node.toString();
            try {
                return reader.read( geoGson );
            }
            catch ( ParseException ex ) {
                throw new IOException( ex );
            }
        }
    }

    public static class GeometrySerializer extends StdSerializer<Geometry> {

        private final GeoJsonWriter writer = new GeoJsonWriter();

        protected GeometrySerializer() {
            this( Geometry.class );
        }

        protected GeometrySerializer(Class<Geometry> t) {
            super( t );
        }

        @Override
        public void serialize(Geometry geometry, JsonGenerator jgen, SerializerProvider serializerProvider) throws IOException {
            jgen.writeRawValue( writer.write( geometry ) );
        }
    }
}

作者/读者来自jts io。

        <!-- GeoJson -->
        <dependency>
            <groupId>com.vividsolutions</groupId>
            <artifactId>jts-io</artifactId>
            <version>1.14.0</version>
        </dependency>

此外:我坚持使用 jts(无法迁移到较新的版本 - locationtech - 由于遗留原因,JBOSS EAP 卡在不支持 locationtech 的 Hibernate 上)。

【问题讨论】:

  • @JsonDeserialize(using = GeometryDeserializer.class) / @JsonDeserialize(using = GeometrySerializer.class) 似乎有效,但我需要以这种方式注释每个 Geometry 属性。我想把它作为默认行为。

标签: java jackson quarkus jts


【解决方案1】:

上述解决方案正确且有效。

问题是我在代码的其他地方添加了:

@Provider
public class JacksonConfig implements ContextResolver<ObjectMapper> {
    private final ObjectMapper objectMapper;

    public JacksonConfig() throws Exception {
        objectMapper = new ObjectMapper();
        objectMapper.enable( SerializationFeature.WRITE_DATES_AS_TIMESTAMPS );
    }

    @Override
    public ObjectMapper getContext(Class<?> arg0) {
        return objectMapper;
    }
}

这会创建一个新的 ObjectMapper 并撤消我在 @Singleton 课程中所做的一切。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    相关资源
    最近更新 更多