it-swarm.com.ru

Джексон игнорирует spring.jackson.properties в моем весеннем загрузочном приложении

Джексон игнорирует 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

это тоже не сработало

13
so-random-dude

У меня была аннотация @EnableWebMvc в одном из классов (ExceptionHandler) в моем приложении (face-Palm!). 

Но, согласно этому выпуск

Если у вас есть аннотация @EnableWebMvc, это отключает автоконфигурация Spring MVC, включая настройку его конвертеры сообщений для настройки сериализации Джексона.

Это ожидаемое поведение, когда вы используете @EnableWebMvc как Вы говорите Spring Boot, что хотите взять контроль над Spring Конфигурация MVC. Это включает в себя настройку его HTTP-сообщения преобразователи для (де) сериализации JSON в соответствии с вашими потребностями.

Если вы хотите переопределить конфигурацию Джексона, вы можете использовать свойства spring.jackson. * или, если вы хотите больше контроля, объявите ваш собственный бин Jackson2ObjectMapperBuilder.

После удаления аннотации @EnableWebMvc это свойство работает как положено.

13
so-random-dude

Согласно документу

/**
 * 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
Liping Huang

Класс MappingJackson2HttpMessageConverter использует экземпляр по умолчанию, созданный с помощью Jackson2ObjectMapperBuilder.json () method. Чтобы использовать ObjectMapper приложения conext, вы можете зарегистрировать пользовательский 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);
            }
        }
    }
}
1
skadya