将 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_CASE
,application.yml
中的设置就足够了。
【问题讨论】:
如果我使用 Spring boot 和spring-boot-starter-web
使用版本 2.0.0.M1 设置一个简单的项目,选项 1 对我来说可以正常工作。你确定你不是自己在某个地方创建了一个 Jackson ObjectMapper
bean 吗?
看起来像 WebFlux 模块的“问题”;它的目标是M3
...我可以等待:)
【参考方案1】:
正如Web-Flux module documentation 所说:
spring-core
模块提供了响应式Encoder
和Decoder
合约,这些合约可以将Flux
的字节序列化到类型化对象和从类型化对象传出。
显然JacksonAutoConfiguration
自动配置的ObjectMapper
不会被WebFluxAutoConfiguration
和WebFluxConfigurationSupport
在配置Jackson2JsonEncoder
的实例时拾取。此问题已在 here 中报告,目前计划在 M3
里程碑。
【讨论】:
确实;看来要等到M3
...谢谢!
...它实际上是固定在 M3
上的(希望能继续)。以上是关于将 Jackson 配置为在 Spring Boot 2.0.0.M1 中“全局”使用 SNAKE_CASE的主要内容,如果未能解决你的问题,请参考以下文章
如何配置 Jackson 在 Micronaut 中使用 SNAKE_CASE?
你能配置 Spring 控制器特定的 Jackson 反序列化吗?
将 Spring REST 端点配置为在序列化响应对象中的日期字段时忽略附加时区