[英]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 WebMvcConfigurationSupport
, WebMvcConfigurationSupport
包含 @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和我来说,这是怎么回事,因为我已经定义的@Bean
的JsonMapper
(对我的代码的不同部分使用),就像这样:
@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.