当前位置: 首页 > 知识库问答 >
问题:

使用RESTEasy/Jackson/Quarkus解析JTS几何到GeoGSON

池麒
2023-03-14

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

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

问题:无法构造com.vividsolutions.jts.geom的实例。Geometry,这让我相信Jackson并不认为Geometry是要解析为String的类。这让我相信对象映射器没有被拾取。。

注1:我可以在Quarkus日志中提供的日志语句中看到:自定义ObjectMapper,添加几何序列化器/反序列化器

注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上)。

共有1个答案

慕容越泽
2023-03-14

上面的解决方案是正确的,有效的。

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

@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,并撤消我在@Singletonclass中所做的任何操作。

 类似资料:
  • 我遇到了一个最奇怪的问题,我就是无法理解。我的网络api使用Spring Boot和postgresql/postgis,在尝试从数据库中读取几何图形时出现了不一致的错误。我已经使用这段代码很多很多年了(当然偶尔会进行修改),这是我上一次发布时才开始发生的。 我在ubuntu 18.04上使用openjdk 11.0.4 2019-07-16 Releventspom.xml条目… 我从以下类型的

  • 我是在resteasy-reactive项目时得到消息的。 (Build-70)[IO.Quarkus.Resteasy.Common.Deployment.ResteasyCommonProcessor]空:Quarkus检测到需要Mutiny响应编程支持,但quarkus-resteasy-mutiny扩展不存在。我使用了夸克斯-雷斯特阿西-反应-jackson,并有以下的依赖关系。 根据我的

  • 我有一个客户机包,其中定义了我的REST客户机,包含以下接口和模型: 编辑: 我使用的是quarkus-rest-client-jackson和quarkus-rest-client依赖项,任何地方都没有jsonb依赖项。 我试图缩小这个问题的范围:我已经将客户机/请求类移到我的主包中,并且我已经删除了lombok注释,并将我的具有Jackson注释的字段公之于众。还是同样的问题...谁能指出我做

  • 测试quarkus应用程序,使用我的restendpoint/初始化 已安装的功能:[cdi,resteasy,resteasy-jackson] 我发现当应用程序以java(非本机)形式运行时,请检查http://localhost:8080/init 它将得到空结果:http://localhost:8080/init 杰克逊是这样配置的: 也不例外。 以java形式运行时,编译quarkus

  • 我在通过邮递员传递json数据时遇到问题。如果Mandetory日期带有注释,没问题。另一个日期接受null。但是在更新时,该日期会产生问题。我使用Java1.8与Spring启动 以下链接我已经访问过,但不适合这个。杰克逊JSON解析错误的LocalDateTime解析:无法构造java.time.LocalDate的实例:没有String参数构造函数/工厂方法从String值反序列化https

  • 我正在尝试实现一个日志过滤器来记录对Quarkus应用程序APIendpoint的请求和响应。我正在使用Quarkus 1.13.3。最终和quarkus resteasy反应。在调用非阻塞endpoint时,尝试记录请求主体时遇到问题。这是我用来记录请求的代码: 当我调用具有@Blocking注释的APIendpoint时,这可以正常工作,但当我调用非阻塞API时,会出现以下错误: 有没有办法绕