【问题标题】:Configure Jackson to use SNAKE_CASE "globally" in Spring Boot 2.0.0.M1将 Jackson 配置为在 Spring Boot 2.0.0.M1 中“全局”使用 SNAKE_CASE
【发布时间】:2017-11-18 16:15:45
【问题描述】:

我正在使用 Spring Boot 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) 注释每个类来使其工作的唯一方法...但这不是我的情况的解决方案。

还有其他选择吗?


这是我的build.gradle.kts 文件中的dependencies“部分”:

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_CASEapplication.yml 中的设置就足够了。

【问题讨论】:

  • 如果我使用 Spring boot 和 spring-boot-starter-web 使用版本 2.0.0.M1 设置一个简单的项目,选项 1 对我来说可以正常工作。你确定你不是自己在某个地方创建了一个 Jackson ObjectMapper bean 吗?
  • 看起来像 WebFlux 模块的“问题”;它的目标是M3...我可以等待:)

标签: java spring-boot jackson kotlin spring-webflux


【解决方案1】:

正如Web-Flux module documentation 所说:

spring-core 模块提供了响应式EncoderDecoder 合约,这些合约可以将Flux 的字节序列化到类型化对象和从类型化对象传出。

显然JacksonAutoConfiguration自动配置的ObjectMapper不会被WebFluxAutoConfigurationWebFluxConfigurationSupport在配置Jackson2JsonEncoder的实例时拾取。此问题已在 here 中报告,目前计划在 M3 里程碑。

【讨论】:

  • 确实;看来要等到M3...谢谢!
  • ...它实际上是固定在 M3 上的(希望能继续)。
猜你喜欢
  • 1970-01-01
  • 2023-01-20
  • 2019-04-11
  • 1970-01-01
  • 2019-06-07
  • 1970-01-01
  • 2017-11-10
  • 2020-03-10
  • 2016-01-28
相关资源
最近更新 更多