Пользовательский ObjectMapper игнорируется после перехода на Spring Boot 2 - PullRequest
0 голосов
/ 19 ноября 2018

Перед миграцией на Spring Boot 2.1.0 у меня было настроено следующее ObjectMapper с расширением WebMvcConfigurerAdapter, работающим, как и ожидалось.

@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {

private static final ObjectMapper objectMapper = buildObjectMapper();

private static ObjectMapper buildObjectMapper() {
    ObjectMapper mapper = new ObjectMapper();
    mapper.setPropertyNamingStrategy(PropertyNamingStrategy.KEBAB_CASE);
    mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
    mapper.configOverride(LocalDate.class).
            setFormat(JsonFormat.Value.forPattern("yyyy-MM-dd"));
    mapper.registerModule(new JavaTimeModule());
    return mapper;
}

public static ObjectMapper getObjectMapper() {
    return objectMapper;
}

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    converters.add(new MappingJackson2HttpMessageConverter(objectMapper)); // JSON converter
}
}

Однако после миграции я вижу, что установка PropertyNamingStrategy, похоже, не имеет никакого эффекта,мое приложение по-прежнему ожидает, что формат полей JSON будет соответствовать значению по умолчанию (например, требуется «bloodType» вместо «blood-type», как ожидается).

Я не думаю, что есть какие-либо проблемы ссам маппер, так как я использую статический getObjectMapper для совместного использования того же экземпляра с REST Assured через RestAssuredConfig и, похоже, все еще ведет себя как ожидалось, если я обновлю свой собственный маппер на поведение по умолчанию (комментируя setPropertyNamingStrategy), все кажетсяработать как ожидалось.

РЕДАКТИРОВАТЬ 1

На самом деле весь мой маппер игнорируется, я пытался изменить формат LocalDate, и это также не имело никакого значения.Обновление заголовка для лучшего отражения проблемы.

Ответы [ 2 ]

0 голосов
/ 19 ноября 2018

Моя проблема была решена путем добавления аннотации @EnableWebMvc, которая согласно документации получает полный контроль над Spring MVC, что изначально не то, что я хотел, но, по крайней мере, имеет смысл.Мне непонятно, почему он работал до перехода на Spring Boot 2 и почему расширение поведения Spring MVC больше не работает.

Я был бы благодарен за один ответ, который добавил бы хорошее объяснение дляэто и в идеале позволит избежать полного переопределения на @EnableWebMvc.

EDIT 1

Обычно вы добавляете @EnableWebMvc для приложения Spring MVC, ноSpring Boot добавляет его автоматически, когда видит spring-webmvc на пути к классам.

Ссылка: https://spring.io/guides/gs/serving-web-content/

К сожалению, это не полное объяснение для меня, какЯ вижу spring-webmvc:5.1.2.RELEASE в моем classpath.

Я отмечу это как ответ, учитывая, что использование @EnableWebMvc или настройка одного @Bean для ObjectMapper работают как ожидалось.

Я все еще хотел бы знать, зачем нужен @EnableWebMvc, учитывая, что согласно документации он не должен.

0 голосов
/ 19 ноября 2018

Я думаю, что ваш картограф propertyNamingStrategy не получает spring boot application его получение из спящего режима propertyNamingStrategy вам следует попробовать это.

spring.jpa.hibernate.naming.physical-strategy=com.example.MyPhysicalNamingStrategy

Ссылка : docs.spring.io/spring-boot/docs/current/reference/html/…

OR

   @Override
    public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
        for (HttpMessageConverter<?> converter : converters) {
            if (converter instanceof MappingJackson2HttpMessageConverter) {
                MappingJackson2HttpMessageConverter jsonMessageConverter = (MappingJackson2HttpMessageConverter) converter;
                ObjectMapper objectMapper = jsonMessageConverter.getObjectMapper();
                mapper.setPropertyNamingStrategy(PropertyNamingStrategy.KEBAB_CASE);
                break;
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...