【问题标题】: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 来解决这个问题。总结:
- 使用 Java 1.8
- 使用 -parameters 参数编译
- 使用和注册jackson-module-parameter-names
以上将导致 Jackson 在字节码中找到构造函数参数的名称,而不需要构造函数上的 @JsonCreator 或 @JsonProperty。
关于命名策略,您可以轻松地将其设置为 applications.properties,虽然我没有对其进行测试,但应该可以使用无注释的构造函数。
【解决方案2】:
使用@JsonCreator 时使用驼峰式。
我在下面的例子中使用了蛇盒。
@JsonCreator
public ApiResponseBuilder(@JsonProperty("status_code")int statusCode, @JsonProperty("status_message")String statusMessage) {