Jackson可以将JSON数据反序列化为不可变对象。但是默认情况下,必须使用@JsonProperty
或@ConstructorProperties
指定构造函数或静态工厂方法参数。我如何配置Jackson和编译器,从而不需要这些注释?在使用Spring Boot时,如何最好地配置这些功能?
序列化Java 17的记录时,不需要进一步的步骤,因为记录存储了它们的组件的名称。但是,当序列化普通类时,需要三个配置:
- 不可变DTO需要使用javac的
-parameters
标志进行编译。 - ParameterNamesModule需要被需要注册到Jackson的ObjectMapper
- 特殊情况是DTO结构采用单一结构化类型(例如List或Map)。在这种情况下,杰克逊使用了所谓的"授权"。模式,在这种情况下是不需要的。这可以通过配置ObjectMapper:
mapper.setConstructorDetector(USE_PROPERTIES_BASED)
来改变。从Jackson 2.12开始支持。
在Spring Boot中,前两个设置是默认设置,因此不需要更改。第三个配置可以通过提供Jackson2ObjectMapperBuilderCustomizer
bean来完成:
@Bean public Jackson2ObjectMapperBuilderCustomizer jacksonCustomizer() {
return builder -> builder.postConfigurer(mapper -> mapper.setConstructorDetector(USE_PROPERTIES_BASED));
}