如何使用Jackson创建不带注解的不可变DTO?

4uqofj5v  于 2022-11-08  发布在  其他
关注(0)|答案(1)|浏览(140)

Jackson可以将JSON数据反序列化为不可变的对象。但是默认情况下,构造函数或静态工厂方法参数必须使用@JsonProperty@ConstructorProperties指定。我如何配置Jackson和编译器,以便不需要这些注解?当使用Sping Boot 时,我如何最好地配置这些注解?

wsxa1bj1

wsxa1bj11#

当序列化Java 17的记录时,不需要进一步的步骤,因为记录存储了它们的组件的名称。但是当序列化普通类时,需要三个配置:

  • 不可变的DTO需要使用javac的-parameters标志进行编译。
  • ParameterNamesModule需要使用Jackson的ObjectMapper注册
  • 一个特殊情况是DTO构造采用单一结构化类型(例如列表或Map)。在这种情况下,Jackson使用所谓的“委托”模式,这在这种情况下是不需要的。这可以通过配置ObjectMapper进行更改:mapper.setConstructorDetector(USE_PROPERTIES_BASED)。从Jackson 2.12开始支持此功能。

在Sping Boot 中,前两个设置是默认的,因此不需要更改。第三个配置可以通过提供Jackson2ObjectMapperBuilderCustomizer bean来完成:

@Bean public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
  return builder -> builder.postConfigurer(mapper -> mapper.setConstructorDetector(USE_PROPERTIES_BASED));
}

相关问题