JsonManagedReference 与 JsonBackReference

问题描述 投票:0回答:4

我想知道杰克逊的

@JsonManagedReference
@JsonBackReference
有什么区别?

java jackson
4个回答
78
投票

@JsonManagedReference 是引用的前向部分——即 正常序列化。 @JsonBackReference 是后面的部分 参考 – 它将在序列化中被省略。

所以它们真的取决于你们关系的方向

public class User {
    public int id;
    public String name;
 
    @JsonManagedReference
    public List<Item> userItems; 
} 

public class Item {
    public int id;
    public String itemName;
 
    @JsonBackReference
    public User owner; 
 }

12
投票
  • @JsonManagedReference -> 管理引用的前向部分,并且此注释标记的字段是被序列化的字段
  • @JsonBackReference -> 管理引用的反向部分,使用该注解标记的字段/集合不会被序列化。

用例: 您的实体/表中有一对多或多对多关系,不使用上述关系会导致类似的错误

Infinite Recursion and hence stackoverflow - > Could not write content: Infinite recursion (StackOverflowError)

发生上述错误是因为 Jackson(或其他类似的人)尝试序列化关系的两端并以递归结束。

@JsonIgnore 执行类似的功能,但上面提到的注释更可取。


7
投票

正如 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<>();
 }

5
投票

@JsonManagedReference
@JsonBackReference
旨在处理字段之间的双向链接,一个用于父角色,另一个用于子角色。

为了避免这个问题,链接的处理方式使得属性 使用 @JsonManagedReference 注解进行注解的情况正常处理 (正常序列化,反序列化无需特殊处理)和 用 @JsonBackReference 注解注释的属性不是 连载;并且在反序列化期间,其值被设置为实例 具有“托管”(转发)链接。

© www.soinside.com 2019 - 2024. All rights reserved.