我想知道杰克逊中@JsonManagedReference
和@JsonBackReference
之间的区别?
答案 0 :(得分:40)
@JsonManagedReference是引用的前向部分 - 那个 正常序列化。 @JsonBackReference是后面的部分 参考 - 它将从序列化中省略。
所以他们真的依赖于你们关系的方向
public class User {
public int id;
public String name;
@JsonBackReference
public List<Item> userItems;
}
public class Item {
public int id;
public String itemName;
@JsonManagedReference
public User owner;
}
答案 1 :(得分:4)
@JsonManagedReference
和@JsonBackReference
旨在处理字段之间的这种双向链接,一个用于父角色,另一个用于子角色。
为了避免这个问题,处理链接以使属性成为可能 注释@JsonManagedReference注释正常处理 (通常序列化,没有特殊的反序列化处理)和 用@JsonBackReference注释注释的属性不是 系列化;在反序列化期间,其值设置为实例 具有“托管”(前进)链接。
答案 2 :(得分:3)
使用案例 您的实体/表格中存在一对多或多对多的关系,如果不使用上述内容,则会导致错误,例如
Infinite Recursion and hence stackoverflow - > Could not write content: Infinite recursion (StackOverflowError)
出现上述错误是因为Jackson(或其他类似的人)试图将关系的两端序列化并最终进行递归。
@JsonIgnore执行类似的功能,但上面提到的注释更可取。
答案 3 :(得分:3)
我更喜欢
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Long.class)
其中property是主键字段的名称,范围是Type of it
答案 4 :(得分:0)
正如Rajat Verma所写,他的解决方案非常有效。谢谢你,你节省了我很多时间和愤怒:-)
重要部分:
您需要将字段定义为List
,之前我将其定义为Set
,并且此解决方案无法正常工作(显示为无限循环)!
我添加了解决方案:
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Long.class)
public class Agent {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToMany(mappedBy = "subscribers")
@ApiModelProperty(dataType = "List", example = "[1,2,3]") // for Swagger
@JsonIdentityReference(alwaysAsId = true) // show only id of Topic
private final List<Topic> subscribeTopics = new ArrayList<>()
}
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id", scope = Long.class)
public class Topic {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@ManyToMany(cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
@JoinTable(name = "topic_agent",
joinColumns = @JoinColumn(name = "fk_topic_id"),
inverseJoinColumns = @JoinColumn(name = "fk_agent_id"))
@ApiModelProperty(dataType = "List", example = "[1,2,3]")
@JsonIdentityReference(alwaysAsId = true)
private final List<Agent> subscribers = new ArrayList<>();
}