你现在可以使用JsonIgnoreProperties到属性(序列化过程中)的抑制序列,或忽略JSON性能的处理读取(反序列化过程)。如果这不是你想要的,请继续阅读以下内容。
(感谢As Zammel AlaaEddine指出了这一点)。
JsonManagedReference和JsonBackReference
从Jackson 1.6开始,你可以使用两个注释来解决无限递归问题,而不必在序列化过程中忽略getter / setter方法:
@JsonManagedReference和
@JsonBackReference。
说明
为了使Jackson正常工作,不应将关系的两个方面之一进行序列化,以避免引起你stackoverflow错误的infite循环。
因此,Jackson接受了引用的前一部分(你
Set<BodyStat> bodyStats在Trainee类中),并将其转换为类似json的存储格式;这就是所谓的编组过程。然后,Jackson查找引用的
Trainee trainee后半部分(即,在BodyStat类中),并将其保留不变,而不对其进行序列化。关系的这一部分将在前向引用的反序列化(反编组)期间重新构建。
你可以这样更改代码(我跳过了无用的部分):
业务对象1:
@Entity@Table(name = "ta_trainee", uniqueConstraints = {@UniqueConstraint(columnNames = {"id"})})public class Trainee extends BusinessObject { @oneToMany(mappedBy = "trainee", fetch = FetchType.EAGER, cascade = CascadeType.ALL) @Column(nullable = true) @JsonManagedReference private Set<BodyStat> bodyStats;业务对象2:
@Entity@Table(name = "ta_bodystat", uniqueConstraints = {@UniqueConstraint(columnNames = {"id"})})public class BodyStat extends BusinessObject { @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) @JoinColumn(name="trainee_fk") @JsonBackReference private Trainee trainee;现在一切都应该正常工作。
如果你需要更多信息,我在我的博客Keenformatics上写了一篇有关Json和Jackson Stackoverflow问题的文章。
编辑:
你可以检查的另一个有用的注释是@JsonIdentityInfo:使用它,每次Jackson序列化你的对象时,它将为它添加一个ID(或你选择的另一个属性),这样就不会每次都完全“扫描”它。当你在更多相互关联的对象之间形成链循环时(例如:Order-> OrderLine-> User-> Order and over over),这很有用。
在这种情况下,你必须要小心,因为你可能需要多次读取对象的属性(例如,在一个产品列表中有多个共享同一卖方的产品),并且此注释会阻止你这样做。我建议始终查看Firebug日志,以检查Json响应,并查看代码中发生了什么。



