开发者社区 > 博文 > Jackson序列化org.locationtech.jts.geom.Point
分享
  • 打开微信扫码分享

  • 点击前往QQ分享

  • 点击前往微博分享

  • 点击复制链接

Jackson序列化org.locationtech.jts.geom.Point

  • 京东城市JUST团队
  • 2021-01-22
  • IP归属:未知
  • 28800浏览

当使用Jackson来序列化 org.locationtech.jts.geom.Point 对象,就会发生递归的栈溢出

GeometryFactory gf = new GeometryFactory();
Point point = gf.createPoint(new Coordinate(1.2345678, 2.3456789));
String geojson = objectMapper.writeValueAsString(point);

如下:

com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (through reference chain:
org.locationtech.jts.geom.Point["envelope"]->org.locationtech.jts.geom.Point["envelope"]->org.locationtech.jts.geom.Point["envelope"]
->org.locationtech.jts.geom.Point["envelope"]->org.locationtech.jts.geom.Point["envelope"]
->org.locationtech.jts.geom.Point["envelope"]->org.locationtech.jts.geom.Point["envelope"]
->org.locationtech.jts.geom.Point["envelope"]-
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:689)
at com.fasterxml.jackson.databind.ser.BeanSerializer.serialize(BeanSerializer.java:157)
at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:693)

这是由于发生了递归调用,jackson不能很好的处理,好在jackson的可扩展性不错,于是出了一些第三方扩展解决这个问题。

比如这位:https://github.com/desoss/jackson-datatype-jts

我们引入其依赖:

 <repository>
	<id>jitpack.io</id>
	<url>https://jitpack.io</url>
</repository>

<dependency>
	<groupId>com.github.desoss</groupId>
	<artifactId>jackson-datatype-jts</artifactId>
	<version>2.5.1.2</version>
</dependency>

然后注册新的module:

objectMapper = new ObjectMapper();
objectMapper.registerModule(new JtsModule());

就可以正确序列化了,源码也就十几个类,可以自己按想要的格式修改。

最后,整个Geometry的实现类都是同样的道理。

共0条评论