杰克逊映射无限递归。春季数据休息

Posted

技术标签:

【中文标题】杰克逊映射无限递归。春季数据休息【英文标题】:Jackson Mapping Infinite Recursion. Spring Data Rest 【发布时间】:2016-04-15 16:45:44 【问题描述】:

我的项目设置是 Spring Boot 1.3.1.RELEASE、Spring Data Rest。

我有一个实体如下

@Entity
public class Criteria extends BaseEntity 
    @OneToMany(fetch = FetchType.EAGER)
    @JoinTable(name = "CRITERIA__GROUP", joinColumns = @JoinColumn(name = "CRITERIA__ID"), inverseJoinColumns = @JoinColumn(name = "GROUP__ID"))
    private Set<Group> planningCriteriaGroup = new HashSet<Group>();


@Entity
public class Group extends BaseEntity 
    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH, CascadeType.PERSIST)
    @JoinColumn(name = "GROUP__ID")
    private Set<Category> categories = new HashSet<Category>(0);


@Entity
public class Category extends BaseEntity 
    @ManyToOne(fetch = FetchType.EAGER)
    @JsonBackReference
    private Category parent;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.EAGER, orphanRemoval = true)
    @Fetch(value = FetchMode.JOIN)
    @JsonManagedReference
    private Set<Category> children = new HashSet<Category>(0);
 

当我卷曲以获取标准时

curl -v -X GET -H "Content-Type: application/json" "http://localhost:8080/criterias"

抛出以下错误 -

"timestamp":1452510716889,"status":500,"error":"内部服务器错误","exception":"org.springframework.http.converter.HttpMessageNotWritableException","message":"无法写入内容:无限递归(***Error)(通过引用链:org.springframework.hateoas.PagedResources[\"_embedded\"]);嵌套异常为com.fasterxml.jackson.databind.JsonMappingException:无限递归(***Error)(通过引用链: org.springframework.hateoas.PagedResources[\"_embedded\"])","path":"/criterias"

@JsonBackReference 和@JsonManagedReference 似乎并不能解决无限递归的问题。

【问题讨论】:

只是为了解决显而易见的问题:您确定您已将 Jackson 配置为考虑字段注释吗?如果是这样,您能否提出一个示例项目来显示该错误并在我们的JIRA 中提交票证。 我尝试添加这个@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE) 仍然没有成功。 【参考方案1】:

您可以在父级处使用@JsonIgnore。

【讨论】:

不,这REMOVE孩子

以上是关于杰克逊映射无限递归。春季数据休息的主要内容,如果未能解决你的问题,请参考以下文章

高级双向杰克逊序列化以避免无限递归

传递 POST 请求。春季安全。休息模板。杰克逊转换器

杰克逊 JSON、Spring MVC 4.2 和 Hibernate JPA 问题的无限递归

如何在没有无限递归的情况下获得实体映射?

使用 OnetoMany 和 ManytoOne 映射时的无限递归循环(双向)

春季数据休息