【问题标题】:Jackson is ignoring spring.jackson.properties in my spring boot applicationJackson 在我的 Spring Boot 应用程序中忽略了 spring.jackson.properties
【发布时间】: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

那也没用

【问题讨论】:

    标签: java spring spring-mvc spring-boot jackson


    【解决方案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()
                }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2018-07-07
                • 1970-01-01
                • 2020-01-27
                • 2018-12-14
                • 2020-05-04
                • 2023-03-16
                • 1970-01-01
                • 2019-12-11
                相关资源
                最近更新 更多