【问题标题】:Deserialization and multiple back-reference properties with name 'defaultReference'名称为“defaultReference”的反序列化和多个反向引用属性
【发布时间】:2015-02-05 00:43:39
【问题描述】:

我正在尝试使用 Jackson 1.9 将嵌套的 JSON 对象反序列化为 POJO,但我遇到了麻烦。下面是类以及我尝试解析的示例 JSON 字符串。

(省略获取器和设置器)

JSON 字符串:

sellerJson = "[{\"id\":\"1\",\"first_name\":\"Joe\",\"last_name\":\"Sellerman\",\"company\":\"NY CANYON RANCH\"," +
                    "\"prorated_sellers\":[{\"first_name\":\"Steve\",\"last_name\":\"Jobs\",\"company\":\"NY CANYON RANCH\"}," +
                    "{\"first_name\":\"Lorne\",\"last_name\":\"Michaels\",\"company\":\"NY CANYON RANCH\"}]," +
                    "\"pens\":[{\"id\":\"2\",\"pen_no\":\"902\"}]}]";

Java 类:

@Table(name="seller")
public class SellerModel implements Serializable, Comparable<SellerModel> {

    private static final long serialVersionUID = 201302111531L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id")  
    private Integer id;

    @Column()
    private String first_name;

    @Column()
    private String last_name;

    @Column()
    private String company;

    @Column()
    private Boolean is_prorated;

    @JsonIgnore
    @ManyToOne()
    @JoinColumn(name="parent_seller_id", referencedColumnName="id")
    private SellerModel parent_seller;

    @JsonManagedReference(value="seller-prorated")
    @OneToMany(mappedBy = "parent_seller", cascade={CascadeType.ALL}, orphanRemoval=true)
    private List<SellerModel> prorated_sellers;

    @JsonManagedReference(value="seller-pen")
    @OneToMany(mappedBy = "parent_seller", cascade={CascadeType.ALL}, orphanRemoval=true)
    private List<PenModel> pens;
}

@Table(name="pen")
public class PenModel implements Serializable, Comparable<PenModel> {

    private static final long serialVersionUID = 201302111537L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column(name="id")  
    private Integer id;

    @Column()
    private String pen_no;

    @JsonBackReference(value="pen-seller")
    @ManyToOne()
    @JoinColumn(name="parent_seller_id", referencedColumnName="id")
    private SellerModel parent_seller;

    @JsonManagedReference(value="pen-livestock")
    @OneToMany(mappedBy = "parent_pen", cascade={CascadeType.ALL}, orphanRemoval=true)
    private List<LivestockModel> livestock;
}

但是当我尝试执行反序列化时:

List<SellerModel> sellers = (List<SellerModel>) mapper.readValue(sellerJson, 
                    mapper.getTypeFactory().constructCollectionType(List.class, SellerModel.class));

我收到以下异常消息:

java.lang.IllegalArgumentException:多个反向引用属性 名称为“defaultReference”

我读到提供 (value='something-unique') 注释属性应该可以解决这个问题,但我没有任何运气。有人有什么建议吗?

【问题讨论】:

    标签: java json jackson


    【解决方案1】:

    我发现至少有两个问题。 第一:

    • SellerModel.prorated_sellers 注释为 @JsonManagedReference(value="seller-pen")
    • PenModel.parent_seller 注释为 @JsonBackReference(value="pen-seller")

    它们必须具有相同的名称,才能相关。

    第二:

    • SellerModel.parent_seller 应使用 @JsonManagedReference(value="seller-prorated") 注释(托管),并删除 @JsonIgnore 注释
    • SellerModel.prorated_sellers 应使用 @JsonBackReference(value="seller-prorated") 注释(返回

    【讨论】:

      猜你喜欢
      • 2017-10-13
      • 2017-08-29
      • 2013-12-05
      • 2020-08-04
      • 2014-04-24
      • 2016-09-18
      • 2013-11-16
      • 2013-10-09
      • 1970-01-01
      相关资源
      最近更新 更多