要点:
有没有办法让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;}
}
答案 0 :(得分:2)
这不是一个直接的解决方案,但Jackson 2.0.0最终将使用@JsonIdentityInfo
注释支持完整的Object Id处理。
文档仍在进行中(页面应为this);但单元测试有不错的例子。
这个想法是指出需要Object Id的类型(或者,指示属性),并且用法与@JsonTypeInfo
的用法非常相似。
杰克逊2.0.0 RC1一周前发布,希望最终的2.0.0应该会在2012年3月底之前发布。