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】:

我想也许你创建的类扩展WebMvcConfigurationSupportWebMvcConfigurationSupport 包含@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 和数据序列化

Spring boot + Jackson - 始终将日期转换为 UTC

Spring Boot:Jackson 不会从“application.properties”中获取配置

Spring boot应用失败,Jackson2ObjectMapperBuilder。可见性不存在

Spring Boot Jackson - 根据深度选择性序列化嵌入式对象属性