Kien Dang Ngoc
Kien Dang Ngoc

Reputation: 1079

Jackson: Multiple back-reference properties with name 'defaultReference'

I'm trying to map a json (string format) to an object and I get the following error

com.fasterxml.jackson.databind.JsonMappingException: Multiple back-reference properties with name 'defaultReference'

This is the json string

{"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":""}

This is the object

@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

and this is the code to do mapping

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

I have no idea with this error, I did exact the same way as I read on Jackson homepage. Anyone who knows about it, please help me

Upvotes: 39

Views: 50593

Answers (4)

Boumadien
Boumadien

Reputation: 21

I also faced this issue, and resolved it. You should name all JsonManagedReferences and JsonBackReference in your application.

example : @JsonManagedReference(value="user-person") @JsonBackReference(value="user-person")

Upvotes: 2

stephen
stephen

Reputation: 771

If you use @JsonBackReference on more than one getter/setter method in your project, you should distinguish them with a specific reference name.

Maybe only one 'defaultReference' is allowed in the latest version?

e.g

In MovementView.java

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

In User.java

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

Upvotes: 77

Gayan Prasanna
Gayan Prasanna

Reputation: 95

I think the best way to handle this is using @JsonIdentityInfo annotation.see the thread which demonstrate this.How to use @JsonIdentityInfo with circular references?

Upvotes: 1

Vivek Gangwar
Vivek Gangwar

Reputation: 1

I also faced this issue, but resolved it.

//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
}

By mentioning @JsonIgnoreProperties("inspection") and @JsonManagedReference.

Resolved the issue raised by using two @JSONBackRefrence in same parent class.

Upvotes: 0

Related Questions