Джексон игнорирует spring.jackson.properties в моем приложении загрузки spring
Джексон игнорирует spring.jackson.property-naming-стратегии = 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
это тоже не сработало
Ответы
Ответ 1
У меня была аннотация @EnableWebMvc
в одном из классов (ExceptionHandler) в моем приложении (лицо-ладонь!).
Но, согласно этому вопросу,
Если у вас есть аннотация @EnableWebMvc, это отключает автоматическую настройку Spring MVC, включая настройку конвертеров сообщений для настройки сериализации Jackson.
Это ожидаемое поведение, когда вы используете @EnableWebMvc, так как этим вы говорите Spring Boot, что хотите взять под контроль конфигурацию Spring MVC. Это включает в себя настройку преобразователей сообщений HTTP для (де) сериализации JSON в соответствии с вашими потребностями.
Если вы хотите переопределить конфигурацию Джексона, вы можете либо использовать свойства spring.jackson. *, Либо, если вам нужен больший контроль, объявить свой собственный компонент Jackson2ObjectMapperBuilder.
После удаления аннотации @EnableWebMvc
это свойство работает как положено.
Ответ 2
Согласно документу
/**
* One of the constants on Jackson 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
Ответ 3
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);
}
}
}
}
Ответ 4
Как и ответ @skadya, я обновляю его в новой весенней версии и стилях Java 8.
@EnableWebMvc
@Configuration
public class WebConfig implements WebMvcConfigurer {
private ObjectMapper mapper;
@Autowired // spring.jackson.* ObjectMapper 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));
}
}
Ответ 5
Для spring.jackson.property-naming-strategy=SNAKE_CASE
, чтобы решить аналогичную проблему, я добавил это в мои application.properties, и они работали хорошо: spring.jackson.property-naming-strategy=SNAKE_CASE
Обратите внимание, вам не нужно полностью квалифицировать SNAKE_CASE, как в других ответах
Ответ 6
Я думаю, что, возможно, вы создали класс extends WebMvcConfigurationSupport
, WebMvcConfigurationSupport
содержит @EnableWebMvc, не расширяет WebMvcConfigurationSupport
, действительно используйте некоторые классы extends WebMvcConfigurationSupport