javascript
Could not write JSON: Infinite recursion (StackOverflowError);
轉(zhuǎn)自:https://blog.csdn.net/east123321/article/details/80435051
在controller返回?cái)?shù)據(jù)到統(tǒng)一json轉(zhuǎn)換的時(shí)候,出現(xiàn)了json infinite recursion stackoverflowerror的錯(cuò)誤,即json在將對(duì)象轉(zhuǎn)換為json格式的數(shù)據(jù)的時(shí)候,出現(xiàn)了無限遞歸調(diào)用的情況。
?
具體的情況如下:
A類中,有個(gè)屬性:List<B> b, A與B的關(guān)系為 OneToMany;在B類中,有屬性A a,引用到A中的字段id,并作為外鍵。hibernate查詢結(jié)果正常,可以看到返回的A對(duì)象中,有b參數(shù)值,但在json轉(zhuǎn)換的時(shí)候就出現(xiàn)了無限遞歸的情況。個(gè)人分析,應(yīng)該是json在序列化A中的b屬性的時(shí)候,找到了B類,然后序列化B類,而B類中有a屬性,因此,為了序列化a屬性,json又得去序列化A類,如此遞歸反復(fù),造成該問題。
解決方法:
在B類中a的getter setter方法上加注解@JsonBackReference ,在getter上加即可解決
@JsonBackReference和@JsonManagedReference:這兩個(gè)標(biāo)注通常配對(duì)使用,通常用在父子關(guān)系中。@JsonBackReference標(biāo)注的屬性在序列化(serialization,即將對(duì)象轉(zhuǎn)換為json數(shù)據(jù))時(shí),會(huì)被忽略(即結(jié)果中的json數(shù)據(jù)不包含該屬性的內(nèi)容)。@JsonManagedReference標(biāo)注的屬性則會(huì)被序列化。在序列化時(shí),@JsonBackReference的作用相當(dāng)于@JsonIgnore,此時(shí)可以沒有@JsonManagedReference。但在反序列化(deserialization,即json數(shù)據(jù)轉(zhuǎn)換為對(duì)象)時(shí),如果沒有@JsonManagedReference,則不會(huì)自動(dòng)注入@JsonBackReference標(biāo)注的屬性(被忽略的父或子);如果有@JsonManagedReference,則會(huì)自動(dòng)注入自動(dòng)注入@JsonBackReference標(biāo)注的屬性。??
@JsonIgnore:直接忽略某個(gè)屬性,以斷開無限遞歸,序列化或反序列化均忽略。當(dāng)然如果標(biāo)注在get、set方法中,則可以分開控制,序列化對(duì)應(yīng)的是get方法,反序列化對(duì)應(yīng)的是set方法。在父子關(guān)系中,當(dāng)反序列化時(shí),@JsonIgnore不會(huì)自動(dòng)注入被忽略的屬性值(父或子),這是它跟@JsonBackReference和@JsonManagedReference最大的區(qū)別。
轉(zhuǎn)載于:https://www.cnblogs.com/Mr-Kenson/p/9086917.html
總結(jié)
以上是生活随笔為你收集整理的Could not write JSON: Infinite recursion (StackOverflowError);的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: xvfb-run: error: xau
- 下一篇: mzy,struts学习(一)