将 Jackson 配置为在 Spring Boot 2.0.0.M1 中“全局”使用 SNAKE_CASE

Posted

技术标签:

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

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

我试过了:

    application.yml 文件包含:

    spring:
      jackson:
        property-naming-strategy: SNAKE_CASE
    

    配置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
    
    

    配置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...我可以等待:) 【参考方案1】:

正如Web-Flux module documentation 所说:

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

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

【讨论】:

确实;看来要等到M3...谢谢! ...它实际上是固定在 M3 上的(希望能继续)。

以上是关于将 Jackson 配置为在 Spring Boot 2.0.0.M1 中“全局”使用 SNAKE_CASE的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot的起步依赖

如何配置 Jackson 在 Micronaut 中使用 SNAKE_CASE?

你能配置 Spring 控制器特定的 Jackson 反序列化吗?

将 Spring REST 端点配置为在序列化响应对象中的日期字段时忽略附加时区

spring-boot实战05:Spring Boo多环境配置及配置属性注入到对象

如何在 Spring Boot 中为 Camel 配置 Jackson ObjectMapper