【问题标题】:Jackson - Don't use @JsonProperty with @JsonPOJOBuilder or @JsonCreator ctorJackson - 不要将@JsonProperty 与@JsonPOJOBuilder 或@JsonCreator ctor 一起使用
【发布时间】:2018-07-14 17:27:36
【问题描述】:

前提条件:

  • Java/Spring Boot
  • PropertyNamingStrategy.UpperCamelCaseStrategy 已设置
  • DTO 类字段是驼峰式的
  • Json 字段是大写的驼峰式
  • DTO/Json 字段名称对齐
  • 保持 DTO 类不可变,避免对字段使用设置器

要求:

  • 在 DTO 类中不使用 @JsonProperty 进行反序列化(隐式)

尝试使用带有@JsonPOJOBuilder 或构造函数的嵌套构建器类,但使用@JsonCreator 注释:

  • @JsonPOJOBuilder setField() 方法上没有 @JsonPropery 的带注释的 Builder 类 - Jackson 未调用 setField() 方法 反序列化
  • 带有@JsonCreator 注释的构造函数 - 明确要求参数上的@JsonProperty

【问题讨论】:

  • 我只是想知道这是否可能,即也接受不可能的答案。

标签: java spring-boot jackson


【解决方案1】:

我已经写了一个blog post 来解决这个问题。总结:

  1. 使用 Java 1.8
  2. 使用 -parameters 参数编译
  3. 使用和注册jackson-module-parameter-names

以上将导致 Jackson 在字节码中找到构造函数参数的名称,而不需要构造函数上的 @JsonCreator@JsonProperty

关于命名策略,您可以轻松地将其设置为 applications.properties,虽然我没有对其进行测试,但应该可以使用无注释的构造函数。

【讨论】:

    【解决方案2】:

    使用@JsonCreator 时使用驼峰式。

    我在下面的例子中使用了蛇盒。 @JsonCreator public ApiResponseBuilder(@JsonProperty("status_code")int statusCode, @JsonProperty("status_message")String statusMessage) {

    【讨论】:

      猜你喜欢
      • 2020-03-26
      • 2018-03-21
      • 2021-04-17
      • 1970-01-01
      • 2015-12-29
      • 2017-12-04
      • 2017-03-30
      • 1970-01-01
      • 2020-06-22
      相关资源
      最近更新 更多