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

前端之家收集整理的这篇文章主要介绍了如何解决Jackson无法处理JPA bean中的直接自引用问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

所以我正在使用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.

猜你在找的Java相关文章