栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java

你现在可以使用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响应,并查看代码中发生了什么。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/370292.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号