Jackson:名称为“defaultReference”的多个反向引用属性

39

我正在尝试将一个JSON(字符串格式)映射到一个对象,但我得到了以下错误:

com.fasterxml.jackson.databind.JsonMappingException: 多个带有名称"defaultReference"的反向引用属性

这是JSON字符串:

{"pledge":"74","client":"66","date":"","originId":"1","qualityId":"2","grade":"19","packing":"4","tons":"1000","fromDate":"","toDate":"","type":0,"remark":"","status":0,"area":"1531","id":-1,"refNumber":"","log":"","user":""}

这是该物体

@Entity
@Table(name="movement", catalog = "wsmill3")
public class MovementView implements java.io.Serializable {
    private Integer id;
    private Integer originId;
    private Integer qualityId;
    private String refNumber;
    private Integer client;
    private String clientRef;
    private Integer grade;
    private Integer packing;
    private Integer pledge;
    private Integer area;
    private Date date;
    private Double tons;
    private Date fromDate;
    private Date toDate;
    private String remark;
    private User user;
    private Byte status;
    private String log;
    private Byte type;
    //constructor, getter and setter

这是进行映射的代码。

String data = request.getParameter("data");
ObjectMapper mapper = new ObjectMapper();
MovementView movement = mapper.readValue(data, MovementView.class);

我对这个错误毫无头绪,我按照Jackson主页上的方法完全一样操作了。任何知道相关信息的人,请帮助我。

4个回答

74

如果您在项目中的多个getter/setter方法上使用@JsonBackReference,则应使用特定参考名称加以区分。

也许在最新版本中只允许使用一个名为'defaultReference'的参考?

例如:

MovementView.java中:

@JsonBackReference(value="user-movement")
public User getUser() {
    return user;
}

User.java

@JsonManagedReference(value="user-movement")
public MovementView getMovementView() {
    return movementView;
}

@ThatGuyGrant 也许你应该像这个例子一样,给所有其他的JsonManagedReferenceJsonBackReference命名,因为没有(value = "something")的情况下只能有一个连接。 - Aleksandar
“User getMovementView()” 应该改为 “MovementView getMovementView()” 吧? - TecHunter
如果我有多个引用,那么在两侧是否都必须给出自定义和唯一的名称? - Perkone

2
我也遇到了这个问题,并解决了它。您应该在应用程序中为所有的JsonManagedReferences和JsonBackReference命名。
例如:@JsonManagedReference(value="user-person") @JsonBackReference(value="user-person")

1

1
鼓励提供外部资源链接,但请添加上下文说明该链接的内容和目的。在引用重要链接时,请引用最相关的部分,以防目标站点无法访问或永久离线。 - baduker

0

我也遇到过这个问题,但已经解决了。

//This is parent class
@Entity
@Table(name = "checklist")
@JsonIgnoreProperties("inspection")
public class Checklist implements java.io.Serializable {

    @ManyToOne
    @JoinColumn(name = "product_id", referencedColumnName = "id")
    @JsonBackReference
    private Product product;

    @OneToMany(mappedBy = "checklists", cascade = CascadeType.ALL)
    @JsonManagedReference
    private Set<Inspection> inspection = new HashSet<Inspection>();
//Constructor
//Getter and Setter
}

//This is child class
@Entity
@Table(name = "inspections")
public class Inspection {

    @ManyToOne
    @JoinColumn(name = "chk_id", referencedColumnName = "id")
    private Checklist checklists;
//Constructor
//Getter and Setter
}

通过使用@JsonIgnoreProperties("inspection")@JsonManagedReference,解决了在同一父类中使用两个@JSONBackRefrence引起的问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接