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