如何使用多态类型和JSON处理双向引用?

如何使用多态类型和JSON处理双向引用?,json,jpa,jackson,Json,Jpa,Jackson,摘要: Jackson有没有办法处理带有多态类型的双向引用,其中也使用了@JsonTypeInfo 底部的一个注释没有,但它写于2010年,并应用于Jackson v1.6.0,所以我希望可能有什么变化,或者有人可以建议一种替代方法 背景: 我在使用Jackson库和JPA时遇到了一个JsonMappingException:Infinite recursion错误。我知道我可以将@JsonIgnore添加为,但缺点是当JPA实体被序列化/反序列化时,我失去了双向关联 Jackson v1.6.

摘要: Jackson有没有办法处理带有多态类型的双向引用,其中也使用了
@JsonTypeInfo

底部的一个注释没有,但它写于2010年,并应用于Jackson v1.6.0,所以我希望可能有什么变化,或者有人可以建议一种替代方法

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

Jackson v1.6.0引入了
@JsonManagedReference
@JsonBackReference
注释。这看起来很不错,但是2010年的版本特别指出,这些注释不适用于使用
@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;}
}
@实体
公共类所有者实现可序列化{
@身份证
@生成值
@列(name=“owner\u id”)
私人长id;
@OneToMany(mappedBy=“pet”,orphanRemoving=true,cascade=CascadeType.ALL)
私人宠物名单;
公共列表getPets(){return pets;}
public void setPets(列出宠物){this.pets=pets;}
}
@实体
@鉴别器列(name=“pet_类型”)
@JsonTypeInfo(
use=JsonTypeInfo.Id.NAME,
include=JsonTypeInfo.As.PROPERTY,
property=“type”)
@JsonSubTypes({
@类型(value=Dog.class,name=“Dog”),
@类型(value=Cat.class,name=“Cat”),
@类型(value=Bird.class,name=“Bird”)})
公共类Pet实现可序列化{
@身份证
@生成值
@列(name=“pet_id”)
私人长id;
@许多酮
@JoinColumn(name=“owner\u id”)
私人业主;
//@杰索尼奥雷
公共所有者getOwner(){return Owner;}
public void setOwner(Owner-Owner){this.Owner=Owner;}
}

这不是一个即时的解决方案,但Jackson 2.0.0最终将使用
@JsonIdentityInfo
注释支持完整的对象Id处理。 文件编制仍在进行中(第页应为);但是单元测试有很好的例子

其思想是指示需要对象Id的类型(或者,指示属性),其用法与
@JsonTypeInfo
非常类似

Jackson 2.0.0 RC1于一周前发布,希望最终版本2.0.0能在2012年3月底前发布