繁体   English   中英

Jackson 在我的 Spring Boot 应用程序中忽略了 spring.jackson.properties

[英]Jackson is ignoring spring.jackson.properties in my spring boot application

杰克逊忽略了 spring.jackson.property-naming-strategy=SNAKE_CASE。 我正在使用 springBootVersion 1.4.2.RELEASE。 在我的 application.properties 文件中,我添加了

spring.jackson.property-naming-strategy=SNAKE_CASE

但是 Jackson 并不尊重这个属性,我的 REST 响应仍然是驼峰式命名法。 有趣的是,这个注释工作得很好

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

有了这个注释,我得到了 snake_case 响应。 但是我不想注释每个响应类,这有点烦人。

编辑

我也尝试使用完全限定的类名,

spring.jackson.property-naming-strategy=com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy

这也不起作用

我在我的应用程序(face-palm!)中的一个类(ExceptionHandler)中有@EnableWebMvc注释。

但是,根据这个问题

如果您有@EnableWebMvc注释,则会禁用Spring MVC的自动配置,包括配置其消息转换器以自定义Jackson的序列化。

当您使用@EnableWebMvc时,这是预期的行为,通过这样做,您告诉Spring Boot您想要控制Spring MVC的配置。 这包括配置其HTTP消息转换器以满足您的需求(de)序列化JSON。

如果要覆盖Jackson配置,可以使用spring.jackson。*属性,或者,如果需要更多控制,请声明自己的Jackson2ObjectMapperBuilder bean。

删除@EnableWebMvc注释后,此属性按预期工作。

根据文件

/**
 * 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

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);
            }
        }
    }
}

我想也许你创建了类 extends WebMvcConfigurationSupportWebMvcConfigurationSupport包含 @EnableWebMvc,不扩展WebMvcConfigurationSupport ,使用一些类扩展WebMvcConfigurationSupport

就像@skadya的回答一样,我在新的Spring版本和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));
    }
}

为了记录,为了解决类似的问题,我将其添加到我的application.properties并且运行良好: spring.jackson.property-naming-strategy=SNAKE_CASE

注意,您不需要像其他答案那样完全限定SNAKE_CASE

对于任何人谁在这个线程跌倒,我有同样症状的OP和我来说,这是怎么回事,因为我已经定义的@BeanJsonMapper (对我的代码的不同部分使用),就像这样:

  @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()
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM