【问题标题】:Is use of @JsonCreator necessary when using @JsonProperty?使用@JsonProperty 时是否需要使用@JsonCreator?
【发布时间】:2016-11-28 12:04:11
【问题描述】:

我在构造函数的参数上使用 Jackson @JsonProperty(name) 注释,我遇到的每个文档都指出我们必须将 @JsonCreator 注释与 @JsonProperty 让它正常工作,但即使没有 @JsonCreator 注释,我的代码 工作正常 那么 @JsonCreator 有什么用

public TestClass(@JsonProperty("name") Map<String, String> data) {
    this.name = name;
}

public Map<String, String> getName() {
    return name;
}

即使没有@JsonCreator 注解,上面的代码也能正常工作。

【问题讨论】:

    标签: java jackson


    【解决方案1】:

    Jackson 的较新版本也确实考虑了所有参数都具有显式 @JsonProperty 的情况,从而无需单独的 @JsonCreator。 可能是 Javadocs 没有更新来解释这种特殊情况。

    请注意,单个 String / int / long / boolean 参数的特殊情况略有不同,因为虽然也会检测到(对于 public 构造函数),但它是“委托”创建者,并且仅在整个传入值的匹配 JSON 类型(分别为 JSON 字符串、数字或布尔值)时才匹配。

    【讨论】:

      【解决方案2】:

      Jackson 必须知道将字段从 JSON 对象传递到构造函数的顺序。因为你有一个单一的参数构造函数,创建工作没有@JsonCreator

      来自 javadoc

      可用于定义构造函数和工厂的标记注解 方法作为一种用于实例化 关联类。

      注意:注释创建者方法(构造函数、工厂方法)时, 方法必须是:

      没有 JsonProperty 的单参数构造函数/工厂方法 参数注释:如果是这样,这就是所谓的“委托” creator”,在这种情况下,杰克逊首先将 JSON 绑定到 参数,然后调用创建者构造函数/工厂方法,其中 每个参数都使用 JsonProperty 或 JacksonInject 进行注释, 表示要绑定的属性的名称

      【讨论】:

        猜你喜欢
        • 2015-12-29
        • 1970-01-01
        • 2018-03-21
        • 1970-01-01
        • 1970-01-01
        • 2012-02-20
        • 1970-01-01
        • 2011-12-08
        相关资源
        最近更新 更多