如何使用 Spring Boot 设置 Jackson 的 constructorDetector?
How do I set Jackson's constructorDetector with Spring Boot?
我想配置 Jackson,使其使用构造函数自动反序列化,而不需要注释。使用 Spring Boot,这对大多数构造函数都是开箱即用的,但不是单参数构造函数。
Jackson 2.12 发布了一个配置选项来为单参数构造函数启用反序列化:
ObjectMapper mapper = JsonMapper.builder()
.constructorDetector(ConstructorDetector.USE_PROPERTIES_BASED)
.build()
但是,这不使用通常的功能 enabling/disabling 界面。如何使用 Spring Boot 进行设置?
- 我不想丢失任何应用于 ObjectMapper bean 的 Spring 引导自动配置。
- 我无法定义 Jackson2ObjectMapperBuilder bean,因为从 Spring Boot 2.4.1 开始,它尚未更新以允许设置 constructorDetector。
定义 Jackson2ObjectMapperBuilder
或 ObjectMapper
的 bean 将阻止对这些 bean 应用任何自动配置,as documented。
相反,您可以定义类型为 Jackson2ObjectMapperBuilderCustomizer
的 bean,它是一个 lambda,可让您在 Spring 引导自动配置 Jackson2ObjectMapperBuilder
.[=19= 上调用其他方法]
此外,Jackson2ObjectMapperBuilder
有方法 postConfigurer
,这是另一个回调,让您可以调用自动配置的 ObjectMapper
上的方法。
将这些放在一起:
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> builder.postConfigurer(mapper ->
mapper.setConstructorDetector(USE_PROPERTIES_BASED)
);
}
我想配置 Jackson,使其使用构造函数自动反序列化,而不需要注释。使用 Spring Boot,这对大多数构造函数都是开箱即用的,但不是单参数构造函数。
Jackson 2.12 发布了一个配置选项来为单参数构造函数启用反序列化:
ObjectMapper mapper = JsonMapper.builder()
.constructorDetector(ConstructorDetector.USE_PROPERTIES_BASED)
.build()
但是,这不使用通常的功能 enabling/disabling 界面。如何使用 Spring Boot 进行设置?
- 我不想丢失任何应用于 ObjectMapper bean 的 Spring 引导自动配置。
- 我无法定义 Jackson2ObjectMapperBuilder bean,因为从 Spring Boot 2.4.1 开始,它尚未更新以允许设置 constructorDetector。
定义 Jackson2ObjectMapperBuilder
或 ObjectMapper
的 bean 将阻止对这些 bean 应用任何自动配置,as documented。
相反,您可以定义类型为 Jackson2ObjectMapperBuilderCustomizer
的 bean,它是一个 lambda,可让您在 Spring 引导自动配置 Jackson2ObjectMapperBuilder
.[=19= 上调用其他方法]
此外,Jackson2ObjectMapperBuilder
有方法 postConfigurer
,这是另一个回调,让您可以调用自动配置的 ObjectMapper
上的方法。
将这些放在一起:
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
return builder -> builder.postConfigurer(mapper ->
mapper.setConstructorDetector(USE_PROPERTIES_BASED)
);
}