Jackson is ignoring spring.jackson.properties in my spring boot application
I think maybe you created class extends WebMvcConfigurationSupport
,WebMvcConfigurationSupport
contains @EnableWebMvc, do not extends WebMvcConfigurationSupport
,do use some class extends WebMvcConfigurationSupport
I had @EnableWebMvc
annotation in one of the classes (ExceptionHandler) in my Application (face-palm!).
But, as per this issue,
If you have @EnableWebMvc annotation, that disables the auto-configuration of Spring MVC, including the configuring of its message converters to customize Jackson's serialization.
It's expected behavior when you use @EnableWebMvc as, by doing so, you're telling Spring Boot that you want to take control of Spring MVC's configuration. That includes configuring its HTTP message converters to (de)serialize JSON in the manner that meets your needs.
If you want to override the Jackson configuration, you can either use the spring.jackson.* properties or, if you want more control, declare your own Jackson2ObjectMapperBuilder bean.
Once I removed @EnableWebMvc
annotation, this property works as expected.
According to the doc
/**
* 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;
You can config it in "application.properties" with this:
spring.jackson.property-naming-strategy=com.fasterxml.jackson.databind.PropertyNamingStrategy.SnakeCaseStrategy
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);
}
}
}
}