如何处理具有多态类型和JSON的双向引用?

时间:2012-03-02 22:45:05

标签: json jpa jackson

要点: 有没有办法让Jackson处理具有多态类型的双向引用,其中@JsonTypeInfo也被使用?

this page底部的注释声明没有,但它是在2010年写的并应用于Jackson v1.6.0所以我希望可能有些事情发生了变化,或者有人可以提出替代方法

背景 我使用Jackson库和JPA收到JsonMappingException: Infinite recursion错误。我知道我可以将@JsonIgnore添加为suggested here,但缺点是当JPA实体被序列化/反序列化时我松开了双向关联。

Jackson v1.6.0引入了@JsonManagedReference@JsonBackReference注释。这看起来很棒但是2010年的documentation明确指出这些注释不适用于使用@JsonTypeInfo的多态处理,这当然就是我所拥有的。

以下是我的实体类的一个人为举例:

@Entity
public class Owner implements Serializable  {

    @Id
    @GeneratedValue
    @Column(name="owner_id")   
    private Long id;

    @OneToMany(mappedBy="pet", orphanRemoval=true, cascade=CascadeType.ALL)
    private List<Pet> pets;

    public List<Pet> getPets() {return pets;}
    public void setPets(List<Pet> pets) {this.pets = pets;}
}

@Entity
@DiscriminatorColumn(name="pet_type")
@JsonTypeInfo(  
        use = JsonTypeInfo.Id.NAME,  
        include = JsonTypeInfo.As.PROPERTY,  
        property = "type")  
    @JsonSubTypes({  
        @Type(value = Dog.class, name = "dog"),
        @Type(value = Cat.class, name = "cat"),
        @Type(value = Bird.class, name = "bird") })  
public class Pet implements Serializable {  

    @Id
    @GeneratedValue
    @Column(name="pet_id") 
    private Long id;

    @ManyToOne
    @JoinColumn(name="owner_id")
    private Owner owner;

    //@JsonIgnore
    public Owner getOwner() {return owner;}
    public void setOwner(Owner owner) {this.owner = owner;}
}

1 个答案:

答案 0 :(得分:2)

这不是一个直接的解决方案,但Jackson 2.0.0最终将使用@JsonIdentityInfo注释支持完整的Object Id处理。 文档仍在进行中(页面应为this);但单元测试有不错的例子。

这个想法是指出需要Object Id的类型(或者,指示属性),并且用法与@JsonTypeInfo的用法非常相似。

杰克逊2.0.0 RC1一周前发布,希望最终的2.0.0应该会在2012年3月底之前发布。