如何使用 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 进行设置?

  1. 我不想丢失任何应用于 ObjectMapper bean 的 Spring 引导自动配置。
  2. 我无法定义 Jackson2ObjectMapperBuilder bean,因为从 Spring Boot 2.4.1 开始,它尚未更新以允许设置 constructorDetector。

定义 Jackson2ObjectMapperBuilderObjectMapper 的 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)
    );
}