【问题标题】:Jackson: Multiple back-reference properties with name 'defaultReference'杰克逊:名称为“defaultReference”的多个反向引用属性
【发布时间】:2013-12-05 19:33:52
【问题描述】:

我正在尝试将 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);

我不知道这个错误,我做的和我在杰克逊主页上读到的完全一样。哪位知道的,请帮帮我

【问题讨论】:

    标签: java spring hibernate jackson


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      如果您在项目中对多个 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 也许您应该将所有其他 JsonManagedReferences 和 JsonBackReferences 命名为此示例所述,因为没有(value = "something") 只能有一个连接。
      • 不应该 User getMovementView()MovementView getMovementView() 吗?
      【解决方案3】:

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

      【讨论】:

      • 鼓励链接到外部资源,但请在链接周围添加上下文,以便您的其他用户了解它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。
      【解决方案4】:

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

      //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 引发的问题。

      【讨论】:

        猜你喜欢
        • 2017-10-13
        • 2017-08-29
        • 1970-01-01
        • 2020-08-04
        • 1970-01-01
        • 1970-01-01
        • 2012-04-22
        • 2016-05-04
        • 2017-06-18
        相关资源
        最近更新 更多