JsonManagedReference与JsonBackReference

时间:2015-07-09 13:43:21

标签: java jackson

我想知道杰克逊中@JsonManagedReference@JsonBackReference之间的区别?

5 个答案:

答案 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)

  • @JsonManagedReference - &gt;管理引用的前向部分,此注释标记的字段是“序列化”
  • 的字段
  • @JsonBackReference - &gt;管理引用的反向部分,使用此注释标记的字段/集合不是序列化的。

使用案例 您的实体/表格中存在一对多或多对多的关系,如果不使用上述内容,则会导致错误,例如

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