Jackson 在我的 Spring Boot 应用程序中忽略了 spring.jackson.properties
Posted
技术标签:
【中文标题】Jackson 在我的 Spring Boot 应用程序中忽略了 spring.jackson.properties【英文标题】:Jackson is ignoring spring.jackson.properties in my spring boot application 【发布时间】:2017-03-31 15:46:51 【问题描述】:Jackson 忽略了 spring.jackson.property-naming-strategy=SNAKE_CASE。 我正在使用 springBootVersion 1.4.2.RELEASE。在我的 application.properties 文件中,我添加了
spring.jackson.property-naming-strategy=SNAKE_CASE
但是 Jackson 不尊重这个属性,我的 REST 响应仍然是 camelCase。有趣的是,这个注释工作得很好
@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)
有了这个注释,我得到了snake_case 响应。但是我不想对每个响应类都加注解,有点烦人。
编辑
我也尝试使用完全限定的类名,
spring.jackson.property-naming-strategy=com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy
那也没用
【问题讨论】:
【参考方案1】:我的应用程序(face-palm!)的其中一个类(ExceptionHandler)中有@EnableWebMvc
注释。
但是,按照这个issue,
如果您有 @EnableWebMvc 注释,则禁用 Spring MVC 的自动配置,包括它的配置 消息转换器来自定义 Jackson 的序列化。
这是您使用 @EnableWebMvc 时的预期行为,因为这样做, 你告诉 Spring Boot 你想控制 Spring MVC 的配置。这包括配置其 HTTP 消息 转换器以满足您需求的方式(反)序列化 JSON。
如果您想覆盖 Jackson 配置,您可以使用 spring.jackson.* 属性,或者,如果您想要更多控制,请声明 你自己的 Jackson2ObjectMapperBuilder bean。
一旦我删除了@EnableWebMvc
注释,这个属性就会按预期工作。
【讨论】:
我在这里遇到了同样的问题,但在我的情况下,如果我的代码没有“@EnableWebMvc”注释。有什么想法吗? @Bruno 抱歉,我不知道任何其他潜在的陷阱;如果您可以添加代码库的 url,我(或一些 SOers 同事)可能会提供帮助,问题是可重现的 @Bruno 你找到问题了吗? 很久以前,不记得了...对不起@ldeck @Ideck 你能解决这个问题吗?【参考方案2】:根据文档
/**
* One of the constants on Jackson's PropertyNamingStrategy
* (CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES). Can also be a fully-qualified class
* name of a PropertyNamingStrategy subclass.
*/
private String propertyNamingStrategy;
你可以在“application.properties”中配置它:
spring.jackson.property-naming-strategy=com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy
【讨论】:
【参考方案3】:MappingJackson2HttpMessageConverter 类使用Jackson2ObjectMapperBuilder.json() 方法创建的默认实例。为了使用应用程序conext的ObjectMapper,您可以注册一个自定义WebMvcConfigurerAdapter。
@Configuration
public class WebMvcDefaultObjectMapperConfigurerAdapter extends WebMvcConfigurerAdapter
private ObjectMapper mapper;
@Autowired
public WebMvcDefaultObjectMapperConfigurerAdapter(ObjectMapper mapper)
// default mapper configured with spring.*
this.mapper = mapper;
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters)
for (HttpMessageConverter<?> httpConverter : converters)
if (httpConverter instanceof MappingJackson2HttpMessageConverter)
// register the configured object mapper to HttpMessageconter
((MappingJackson2HttpMessageConverter) httpConverter).setObjectMapper(mapper);
【讨论】:
【参考方案4】:我想也许你创建的类扩展WebMvcConfigurationSupport
,WebMvcConfigurationSupport
包含@EnableWebMvc,不要扩展WebMvcConfigurationSupport
,使用某些类扩展WebMvcConfigurationSupport
【讨论】:
【参考方案5】:就像@skadya 的回答一样,我将其更新为新的春季版本和 Java 8 样式。
@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer
private ObjectMapper mapper;
@Autowired // spring.jackson.* ObjectMapper's config
public WebConfig(ObjectMapper mapper)
this.mapper = mapper;
@Override
public void extendMessageConverters (List<HttpMessageConverter<?>> converters)
converters.stream()
.filter(x -> x instanceof MappingJackson2HttpMessageConverter)
.forEach(x -> ((MappingJackson2HttpMessageConverter) x).setObjectMapper(mapper));
【讨论】:
【参考方案6】:作为记录,为了解决一个类似的问题,我将它添加到我的 application.properties 并且效果很好:
spring.jackson.property-naming-strategy=SNAKE_CASE
注意,您不需要像其他答案那样完全限定 SNAKE_CASE
【讨论】:
【参考方案7】:对于任何偶然发现此线程的人,我有与 OP 相同的症状,就我而言,它正在发生,因为我为 JsonMapper
定义了 @Bean
(用于我代码的不同部分) ,像这样:
@Bean
fun objectMapper(): JsonMapper
return JsonMapper.builder()
.findAndAddModules()
.build()
我忘记的是 Spring 使用 Jackson 来转换消息。所以,为了修复它,我只需要定义一个PropertyNamingStrategies
:
@Bean
fun objectMapper(): JsonMapper
return JsonMapper.builder()
.findAndAddModules()
.propertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE)
.build()
【讨论】:
以上是关于Jackson 在我的 Spring Boot 应用程序中忽略了 spring.jackson.properties的主要内容,如果未能解决你的问题,请参考以下文章
在 Jackson / Spring Boot 中测试自定义 Json Deserializer
Spring boot + Jackson - 始终将日期转换为 UTC
Spring Boot:Jackson 不会从“application.properties”中获取配置