加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何解决Jackson无法处理JPA bean中的直接自引用问题

发布时间:2020-12-14 19:18:34 所属栏目:Java 来源:网络整理
导读:所以我正在使用Java,Hibernate,JPA注释,JAX-RS注释,JAXB注释,Jersey和Jackson JSON解析器开发RESTful数据API. 在尝试了Jersey提供的MAPPING和NATURAL JSON符号的各种配置后,我最终决定使用Jackson JSON解析器.除了这一个问题,杰克逊将是完美的 我遇到的问题

所以我正在使用Java,Hibernate,JPA注释,JAX-RS注释,JAXB注释,Jersey和Jackson JSON解析器开发RESTful数据API.

在尝试了Jersey提供的MAPPING和NATURAL JSON符号的各种配置后,我最终决定使用Jackson JSON解析器.除了这一个问题,杰克逊将是完美的……

我遇到的问题是Jackson没有使用JAXB注释“@XmlID”和“@XmlIDREF”,我用它来表示我的实体关系,虽然“@JsonBackReference”和“@JsonManagedReference”帮助这个.在处理直接自引用属性时,这种组合似乎会崩溃.

这似乎是一个相当普遍的问题.你怎么能和杰克逊一起绕过这个限制?

以我的POJO为……

@XmlRootElement
public class Employee implements Serializable {
    private Date lastUpdatedOn;
    private Employee lastUpdatedBy;
    private Integer empId;

    @JoinColumn(nullable=false)
    @OneToOne
    @XmlIDREF
    public Employee getLastUpdatedBy() {
        return createdBy;
    }
    public void setLastUpdatedBy(Employee lastUpdatedBy) {
        this.lastUpdatedBy = lastUpdatedBy;
    }

    @Temporal(TemporalType.TIMESTAMP)
    public Date getLastUpdatedOn() {
        return createdOn;
    }
    public void setLastUpdatedOn(Date lastUpdatedOn) {
        this.lastUpdatedOn = lastUpdatedOn;
    }
    @XmlID
    @XmlJavaTypeAdapter(IntegerAdapter.class)
    public Integer getEmpId() {
        return empId;
    }
    public void setEmpId(Integer empId) {
        this.empId = empId;
    }
}

……以及以下EmployeeResource ……

@Path("/Employees")
public class EmployeeResource {
  private List

我的JAX-RS资源将产生以下错误

org.codehaus.jackson.map.JsonMappingException: Direct self-reference leading to cycle (through reference chain: resources.EmployeeResource["employees"]->java.util.ArrayList[0]->entities.Employee["lastUpdatedBy"])

……但我希望它能产生……

{
  "employees" : [ {
    "lastUpdatedOn" : 1331149770737,"lastUpdatedBy" : 10150,"empId" : 10150,} ],}

大家提前感谢!

笔记:

>我使用IntegerAdapter.class将其转换为字符串,以便它可以与@XmlID注释一起使用.
>上面描述的Employee和EmployeeResource类只是我实际实现的缩写版本,但它们代表了我的实现中与此直接自引用问题相关的部分.

编辑#1 2012.03.10
对不起,在我这个问题的第一个版本中,我对使用泽西岛的自然符号与我与杰克逊运行的版本之间的版本感到困惑.我已经修改了我的问题,以更准确地反映我与杰克逊的直接自我引用问题.

最佳答案
Jackson 1.x没有特定的支持来解析循环引用,但是支持处理父/子样式依赖:this博客条目有更多信息.

Jackson 2.0将使用新的@JsonIdentityInfo注释支持任意Object Id /引用处理,因此也许可以用来解决问题.官方2.0版本尚未发布,但是发布候选版本(最新版本为RC2)是,如果你想看看.不确定它是否能解决您的问题,但也许会有所帮助.

编辑:实际上,Jackson JAXB注释模块将支持2.0.0的@XmlID / @XmlIDREF – 这刚刚实现,见here.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读