【问题标题】:Why Jackson JSON mapping exception when Serializing/Deserializing Geometry type为什么序列化/反序列化几何类型时杰克逊 JSON 映射异常
【发布时间】:2020-06-01 03:20:10
【问题描述】:

当我创建一个用户定义的类“资产”时。

public class Asset {
    private UUID id;
    private String name;
}

并设置该类的一个对象作为响应。

@GetMapping("/testSerialization")
public Asset testSerialization() {
    return new Asset()
}

此控制器工作成功。

但是当同一个控制器使用几何类型时请求失败,

import com.vividsolutions.jts.geom.Point;

// Does not work
@GetMapping("/testSerialization")
public Point testSerialization() {
    GeometryFactory geometryFactory = new GeometryFactory();
    Point point = geometryFactory.createPoint(new Coordinate(1, 2));
    return point;
}

我知道我必须手动或使用 Jackson-datatype-jts 之类的库向 Jackson 添加序列化和反序列化引用,以使 Jackson 能够使用几何类

我的问题是,为什么我必须为 Geomtery 类型显式执行此操作,而我的自定义类无需操作任何配置即可工作?

【问题讨论】:

  • 你能发布你的Point类是什么样子的吗?
  • 你的 JSON 是什么样的?有什么例外?
  • 1.点类由 com.vividsolutions.jts.geom.Point 提供。 2.返回Point对象时出现异常:Could not write JSON: Infinite recursion (StackOverflowError);嵌套异常是 com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (通过引用链:com.vividsolutions.jts.geom.Point["envelope"]->com.vividsolutions.jts.geom.Point["信封"]->

标签: java json serialization jackson deserialization


【解决方案1】:

Jackson 无需任何额外配置即可与所有常规 POJO 类一起正常工作。当POJO类不规则时出现问题:例如,没有getterssettersno-arg构造函数等。

在您的情况下,两个或多个类之间具有循环引用。当默认序列化程序想要序列化所有属性时,它会因此陷入无限递归。在这种情况下,我们需要提供能够正确处理这种情况的自定义序列化程序。

这就是为什么您需要为com.vividsolutions.jts.geom 包提供自定义序列化器和反序列化器的原因。

【讨论】:

  • 知道了,谢谢。我假设几何类(Point、Polygon 等)类似于 POJO 类,但现在我了解设置自定义序列化器和反序列化器的必要性。
猜你喜欢
  • 2012-11-19
  • 2012-12-12
  • 2015-04-07
  • 2015-01-09
  • 2014-07-25
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多