杰克逊 - 不要将@JsonProperty与@JsonPOJOBuilder或@JsonCreator ctor一起使用

时间:2018-02-07 09:06:48

标签: java spring-boot jackson

前提条件:

  
      
  • Java / Spring Boot
  •   
  • PropertyNamingStrategy.UpperCamelCaseStrategy已设置
  •   
  • DTO课程字段是骆驼案例
  •   
  • Json字段是上层驼峰案例
  •   
  • DTO / Json字段名称已对齐
  •   
  • 保持DTO类不可变,避免使用字段的setter
  •   

要求:

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

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

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

2 个答案:

答案 0 :(得分:3)

我写了一个blog post的解决方案。总结:

  1. 使用Java 1.8
  2. 使用-parameters参数编译
  3. 使用并注册jackson-module-parameter-names
  4. 以上将导致Jackson在字节码中找到构造函数的参数名称,而不需要构造函数上的@JsonCreator@JsonProperty

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

答案 1 :(得分:0)

使用@JsonCreator时,请使用驼峰式保护套。

在以下示例中,我使用了蛇皮套。 @JsonCreator 公共ApiResponseBuilder(@JsonProperty(“ status_code”)int statusCode,@JsonProperty(“ status_message”)String statusMessage){