hibernate关系映射导致的json解析无限循环问题解决

在使用Gson序列化数据集合为json时,出现了栈溢出异常,发现Gson在不断调用解析方法,造成栈空间不足。但是要解析的数据并没有那么多;后来尝试使用@ResponseBody注解,也就是jackson解析框架,可以返回json,但是发现返回的json数据非常大并且格式错误(由于双向映射导致json循环拼接而过大,无法返回完整数据)。经过排查,发现是由于使用了hibernate的一对多双向关系映射,两个数据对象中有双向引用,例如:部门类Department中存储了人员的数据集合list<user>,人员类User中存储了部门类对象department;

解决hibernate+json导致的无线循环的问题方法:

1、@JsonBackReference和@JsonManagedReference:这两个标注通常配对使用,通常用在父子关系中。@JsonBackReference标注的属性在序列化(对象转换为json)时,会被忽略(即结果中的json数据不包含该属性的内容)。@JsonManagedReference标注的属性则会被序列化。在序列化时,@JsonBackReference的作用相当于@JsonIgnore,此时可以没有@JsonManagedReference。但在反序列化(json数据转换为对象)时,如果没有@JsonManagedReference,则不会自动注入@JsonBackReference标注的属性(被忽略的父或子);如果有@JsonManagedReference,则会自动注入自动注入该属性。 

2、@JsonIgnore(本人直接使用第二种):直接忽略某个属性,以断开无限递归,序列化或反序列化均忽略。当然如果标注在get、set方法中,则可以分开控制,序列化对应的是get方法,反序列化对应的是set方法。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值