【问题标题】:Jackson: Customizing resolving of ObjectIds (from @JsonIdentityInfo)Jackson:自定义解析 ObjectIds(来自@JsonIdentityInfo)
【发布时间】:2013-12-02 18:52:28
【问题描述】:

在我的 Spring WebMVC 应用程序中,我试图反序列化对象引用列表。

这是我的模型字段的样子:

@Entity
@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Article {
    @Id
    private Integer id;

    @ManyToMany(cascade=CascadeType.ALL)
    @JsonIdentityReference(alwaysAsId=true)
    private List<Article> related;
}

每当我尝试反序列化 JSON 对象时,都会收到以下调试消息:

com.fasterxml.jackson.databind.JsonMappingException: 无法解析 对象 ID [351](用于 [简单类型,类 com.company.package.domain.Article]) -- 未解决 前向参考? (通过参考链: com.company.package.domain.Article["related"])

对象如下所示:

{ 
  "id": 123,
  "related": [351]
}

我已经尝试编写我的自定义反序列化器来处理这个问题,但是由于关系是同一个类的对象,Jackson 也会尝试使用自定义反序列化器反序列化父对象,这显然会失败,因为它是不只是一个整数......

那么有没有办法告诉 Jackson 使用数据库来查找 ID 后面的对象?

【问题讨论】:

    标签: java spring-mvc jackson


    【解决方案1】:

    从 2.4.0 版开始,您可以使用 @JsonIdentityInfo 注释的“解析器”属性。

    @JsonIdentityInfo(
            generator = ObjectIdGenerators.PropertyGenerator.class,
            resolver = MyCustomObjectIdResolver.class,
            scope = Article.class,
            property = "id")
    @JsonIdentityReference(alwaysAsId = true)
    private List<Article> related;
    

    当你这样做时,你很可能会因为 @JsonIdentityReference(alwaysAsId=true) 而被 https://github.com/FasterXML/jackson-databind/issues/524 惹恼。

    这已在 2.4.3 https://github.com/FasterXML/jackson-databind/commit/17690f355e19cee89967b075fe4a510d780b1d2b 中修复

    【讨论】:

    • 试图编辑您的帖子,因为代码中的 MyCustomObjectIdResolver.class 中有错字。您的代码在自定义中显示“n”而不是“m”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 2016-11-17
    • 2021-09-28
    • 2021-12-08
    相关资源
    最近更新 更多