配置 Jackson 在 Spring Boot 2.0.0.M1 中使用 SNAKE_CASE "globally"

Configure Jackson to use SNAKE_CASE "globally" in Spring Boot 2.0.0.M1

我正在使用 Spring 启动 2.0.0.M1(因此 Spring 5.0.0.RC1)。我正在尝试将其配置为使用 PropertyNamingStrategy.SnakeCaseStrategy.SNAKE_CASE,但到目前为止我还没有工作。

我试过:

  1. application.yml 文件包含:

    spring:
      jackson:
        property-naming-strategy: SNAKE_CASE
    
  2. 配置一个 Jackson2ObjectMapperBuilder bean:

    @Bean
    @Primary
    open fun jacksonBuilder(): Jackson2ObjectMapperBuilder {
      val jacksonMapperBuilder = Jackson2ObjectMapperBuilder()
          .failOnUnknownProperties(false)
          .modules(JavaTimeModule(), KotlinModule())
          .propertyNamingStrategy(PropertyNamingStrategy.SnakeCaseStrategy.SNAKE_CASE)
      logger.info { "Jackson2ObjectMapperBuilder configured successfully..." }
      return jacksonMapperBuilder
    }
    
  3. 配置一个 ObjectMapper bean:

    @Bean
    @Primary
    open fun objectMapper(): ObjectMapper {
      val objectMapper = ObjectMapper()
      objectMapper.registerModule(JavaTimeModule())
      objectMapper.registerModule(KotlinModule())
      objectMapper.setPropertyNamingStrategy(PropertyNamingStrategy.SnakeCaseStrategy.SNAKE_CASE)
      logger.info { "ObjectMapper configured successfully..." }
      return objectMapper
    }
    

我发现使它工作的唯一方法是用 @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy::class) 注释每个 class...但这不是我的情况的解决方案。

还有其他选择吗?


这是我的 build.gradle.kts 文件中的 dependencies "section":

dependencies {
  compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
  compile("com.fasterxml.jackson.module:jackson-module-kotlin")
  compile("io.github.microutils:kotlin-logging:1.4.4")
  //compile("io.projectreactor:reactor-kotlin-extensions")
  compile("org.springframework.boot:spring-boot-starter-actuator")
  compile("org.springframework.boot:spring-boot-starter-data-mongodb-reactive")
  compile("org.springframework.boot:spring-boot-starter-webflux")
  compile(kotlin("stdlib"))

  testCompile("io.projectreactor.addons:reactor-test")
  testCompile("org.springframework.boot:spring-boot-starter-test")
}

更新:

这确实已在 M3 上修复;如果您需要 SnakeCaseStrategy.SNAKE_CASE application.yml 中的设置就足够了。

Web-Flux module documentation 所述:

The spring-core module provides reactive Encoder and Decoder contracts that enable the serialization of a Flux of bytes to and from typed objects.

显然 JacksonAutoConfiguration 自动配置的 ObjectMapper 不会被 WebFluxAutoConfiguration and WebFluxConfigurationSupport when configuring an instance of Jackson2JsonEncoder. This issue already reported in here 使用,目前计划用于 M3 里程碑。