当使用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的实现类都是同样的道理。