我知道@JsonIgnore
和@JsonManagedReference
,@JsonBackReference
用于解决Infinite recursion (StackOverflowError)
,这两者之间有什么区别?
注意: 这些是杰克逊的注释。
答案 0 :(得分:44)
假设我们有
private class Player {
public int id;
public Info info;
}
private class Info {
public int id;
public Player parentPlayer;
}
// something like this:
Player player = new Player(1);
player.info = new Info(1, player);
@JsonIgnore
private class Info {
public int id;
@JsonIgnore
public Player parentPlayer;
}
和@JsonManagedReference
+ @JsonBackReference
private class Player {
public int id;
@JsonManagedReference
public Info info;
}
private class Info {
public int id;
@JsonBackReference
public Player parentPlayer;
}
将产生相同的输出。上面的演示案例的输出是:{"id":1,"info":{"id":1}}
这是主要区别,因为使用@JsonIgnore
进行反序列化
只会将null设置为该字段,因此在我们的示例中,parentPlayer将为== null。
但是@JsonManagedReference
+ @JsonBackReference
我们会在那里得到Info
的回复
答案 1 :(得分:29)
用于解决无限递归(StackOverflowError)
@JsonIgnore
并非旨在解决 Infinite Recursion 问题,它只是忽略了被注释的属性被序列化或反序列化。但是如果字段之间存在双向链接,由于@JsonIgnore
忽略了带注释的属性,您可以避免无限递归。
另一方面,@JsonManagedReference
和@JsonBackReference
旨在处理字段之间的双向链接,一个用于 Parent 角色,另一个用于 Child 角色分别为:
为了避免这个问题,处理链接以使属性成为可能 带有
@JsonManagedReference
注释的注释正常处理 (通常序列化,没有特殊的反序列化处理)和 用@JsonBackReference
注释注释的属性不是 系列化;在反序列化期间,其值设置为实例 有#34;托管" (转发)链接。
总结一下,如果您在序列化或反序列化过程中不需要这些属性,则可以使用@JsonIgnore
。否则,使用@JsonManagedReference
/ @JsonBackReference
对是可行的方法。