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