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

时间:2013-11-21 11:02:25

标签: java spring hibernate jackson

我正在尝试将json(字符串格式)映射到对象,我收到以下错误

  

com.fasterxml.jackson.databind.JsonMappingException:Multiple   名为'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);

我不知道这个错误,我确实和我在杰克逊主页上读到的方式完全相同。任何了解它的人,请帮帮我

4 个答案:

答案 0 :(得分:40)

如果你对项目中的getter / setter方法使用@JsonBackReference两次以上,你应该用特定的引用名称来区分它们。也许只有一个' defaultReference'允许使用最新版本。

e.g

在MovementView.class中

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

在User.class

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

答案 1 :(得分: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引发的问题。

答案 2 :(得分:0)

我认为处理此问题的最佳方法是使用@JsonIdentityInfo注释。查看演示此内容的线程。How to use @JsonIdentityInfo with circular references?

答案 3 :(得分:0)

我也遇到了这个问题,并解决了。 您应该在应用程序中命名所有JsonManagedReferences和JsonBackReference。

示例:@JsonManagedReference(value =“ user-person”) @JsonBackReference(value =“ user-person”)