杰克逊忽略了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
既不起作用
答案 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)
我认为也许您创建的类扩展了WebMvcConfigurationSupport
,WebMvcConfigurationSupport
包含@EnableWebMvc,不扩展了WebMvcConfigurationSupport
,请使用某些类扩展了WebMvcConfigurationSupport