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