【发布时间】:2018-01-24 14:51:11
【问题描述】:
我有一个@Entity 模型,它的属性类型为com.vividsolutions.jts.geom.Point。当我尝试在 @RestController 中渲染这个模型时,我得到一个递归异常。
(StackOverflowError); nested exception is
com.fasterxml.jackson.databind.JsonMappingException: Infinite
recursion (StackOverflowError) (through reference chain:
com.vividsolutions.jts.geom.Point[\"envelope\"]-
>com.vividsolutions.jts.geom.Point[\"envelope\"]....
实体看起来像这样(为了简洁而缩短):
@Entity
@Data
public class MyEntity{
// ...
@Column(columnDefinition = "geometry")
private Point location;
// ...
}
经过一番研究,我发现这是因为 Jackson 默认无法反序列化 GeoJson。添加这个库应该可以解决问题:https://github.com/bedatadriven/jackson-datatype-jts。
我现在不确定如何在 Spring Boot 的对象映射器中包含这个模块。根据 boot 中的文档,我尝试通过以下两种方式将其添加到 @Configuration:
@Bean
public Jackson2ObjectMapperBuilder jacksonBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
builder.modulesToInstall(new JtsModule());
return builder;
}
和
@Bean
public JtsModule jtsModule(){
return new JtsModule();
}
两者都没有删除异常。抱歉,如果这是重复的,但我能找到的只是自定义 ObjectMapper,据我了解,这不是“春季启动方式”。
作为一种解决方法,我是 @JsonIgnoreing Point 并为不存在的协调对象提供自定义 getter 和 setter,...但这不是我想要保留它的方式。
【问题讨论】:
-
你想让
Point location不序列化吗?或者是其他东西 ?如果您有 @JsonIgnore 则对象未序列化。 -
不,我希望
Point location被序列化。@JsonIgnore只是自定义 getter 的临时解决方法,因此 Jackson 在序列化Point时不会死。 -
你找到解决办法了吗?
标签: java spring-boot jackson geojson