杰克逊在我的春季启动应用程序中忽略了spring.jackson.properties

时间:2016-11-17 07:40:35

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

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

  

spring.jackson.property命名策略= SNAKE_CASE

但杰克逊并不尊重这个属性,我的REST响应仍然是camelCase。有趣的是,这个注释工作得很好

  

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class)

通过这个注释,我得到了snake_case响应。但我不想对每个响应类进行注释,这有点烦人。

修改

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

  

spring.jackson.property命名策略= com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy

既不起作用

6 个答案:

答案 0 :(得分:14)

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

但是,按照issue

  

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

     

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

     

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

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

答案 1 :(得分: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

答案 2 :(得分:1)

MappingJackson2HttpMessageConverter class uses the default instance created by Jackson2ObjectMapperBuilder.json() method. In order to use application conext's ObjectMapper, you can register a custom 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);
            }
        }
    }
}

答案 3 :(得分:0)

就像@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));
    }
}

答案 4 :(得分:0)

出于记录目的,为了解决类似的问题,我将此添加到了application.properties中,并且效果很好: spring.jackson.property-naming-strategy=SNAKE_CASE

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

答案 5 :(得分:0)

我认为也许您创建的类扩展了WebMvcConfigurationSupportWebMvcConfigurationSupport包含@EnableWebMvc,不扩展了WebMvcConfigurationSupport,请使用某些类扩展了WebMvcConfigurationSupport