Сериализация Джексона не работает после обновления Spring Boot

Вчера я начал с обновления Spring Brussels-SR3 до Spring Brussels-SR6.
Spring Boot начинается с версии 1.5.4. до 1.5.9, Джексон переходит от 2.8.8 до 2.8.10). Я использую ссылки HATEOAS и HAL. Это означает, что моя конфигурация Джексона выглядит так:

@Configuration
public class JacksonConfiguration {

    private static final String SPRING_HATEOAS_OBJECT_MAPPER = "_halObjectMapper";

    @Autowired
    @Qualifier(SPRING_HATEOAS_OBJECT_MAPPER)
    private ObjectMapper springHateoasObjectMapper;

    @Primary
    @Bean(name = "objectMapper")
    ObjectMapper objectMapper() {
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(ZonedDateTime.class, new ZonedDateTimeSerializer(DateTimeFormatter.ISO_INSTANT));

        springHateoasObjectMapper.registerModules(javaTimeModule);

        springHateoasObjectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        springHateoasObjectMapper.disable(DeserializationFeature.READ_DATE_TIMESTAMPS_AS_NANOSECONDS);

        springHateoasObjectMapper.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);
        springHateoasObjectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
        springHateoasObjectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);

        springHateoasObjectMapper.enable(SerializationFeature.INDENT_OUTPUT);

        springHateoasObjectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
        return springHateoasObjectMapper;
    }
}

Это означает, что я повторно использую bean-компонент _halObjectMapper и добавляю еще несколько конфигураций. Он работал, пока я не начал с обновления.

Что не так?

Что идет не так, так это то, что после обновления все мои настройки сериализации и соглашения HAL не применяются - форматы даты и времени, отступ поля HAL "_links" JSON изменяется на «ссылки» ... Таким образом, _halObjectMapper больше не используется для сериализации.

Любая подсказка, в чем может быть проблема или где я должен копать, чтобы выяснить, что не так?

Дополнительная информация после некоторой отладки:

Я понял, что TypeConstrainedMappingJackson2HttpMessageConverter, использующий _halObjectMapper, больше не используется для преобразования в json. Причина в том, что он не попадает в сборник преобразователей при запуске пружины. Похоже, что он не создан для bean-компонента RequestMappingHandlerAdapter из-за некоторого условия, которое пропускает создание, когда Jackson2HalModule уже зарегистрирован в каком-то другом преобразователе (в данном случае ProjectingJackson2HttpMessageConverter).

Любая идея, что может быть причиной или где посмотреть, чтобы выяснить, почему запуск весенней загрузки происходит по-другому?

Дополнительная информация после отладки:

Разница, которую я вижу до и после обновления, заключается в том, что перед обновлением ProjectingJackson2HttpMessageConverter был заполнен новым экземпляром ObjectMapper. Но после обновления ObjectMapper разрешается из контейнера, поэтому выбирается _halObjectMapper. В результате ProjectingJackson2HttpMessageConverter соответствует преобразователю с зарегистрированным halModule, а создание TypeConstrainedMappingJackson2HttpMessageConverter для RequestMappingHandlerAdapter исключено.

Еще интересно, что есть еще два микросервиса, которые я обновил. Разница в том, что у одного такая же проблема, а другой работает. Тот, который работает, имеет другую настройку безопасности Spring и oauth2. Бин класса OAuth2RestTemplate не определен в работающем микросервисе. Микросервисы с OAuth2RestTemplate имеют проблему. Причина, по которой я указываю на это, заключается в том, что в этих двух случаях поведение при инициализации различно. Остаточный шаблон OAuth2RestTemplate также заполняется этими преобразователями, и это может повлиять на процесс инициализации.

Временное решение

В качестве временного исправления я понизил версию spring-data-commons с 1.13.6.RELEASE до 1.13.6.RELEASE. Однако новый код имеет больше смысла для меня.

Я все еще пытаюсь добиться лучшего понимания и найти правильный подход


person Lukas S    schedule 16.12.2017    source источник
comment
Я не вижу, где это не работает.   -  person Antoniossss    schedule 18.12.2017
comment
TypeConstrainedMappingJackson2HttpMessageConverter с _halObjectMapper не используется для сериализации, поэтому ни одна из моих настроек конфигурации не применяется. В результате формат даты и времени нарушен, отступа нет, ссылки вместо _links, подструктура ссылок не карта, а массив и так далее...   -  person Lukas S    schedule 18.12.2017
comment
Вы нашли решение?   -  person desoss    schedule 05.04.2018
comment
Нет, не сейчас. Я все еще использую упомянутую версию spring-data-commons. У вас такая же проблема?   -  person Lukas S    schedule 06.04.2018


Ответы (1)


Я не знаю, будет ли это полезно для вас, но у меня была очень похожая проблема с обновлением Spring Boot с версии 2.0.3 до 2.0.4. Я до сих пор не знаю, что именно вызвало проблему, но решение заключалось в том, чтобы создавать Bean-компоненты для каждого модуля, который я использую, вместо замены стандартного ObjectMapper. В вашем случае это будет выглядеть примерно так:

    @Configuration
public class JacksonConfiguration {

    @Bean
    JavaTimeModule javaTimeModule () {
        JavaTimeModule javaTimeModule = new JavaTimeModule();
        javaTimeModule.addSerializer(ZonedDateTime.class, new ZonedDateTimeSerializer(DateTimeFormatter.ISO_INSTANT));
        return javaTimeModule;
    }
}

Все функции можно настроить через файл application.properties следующим образом:

spring.jackson.deserialization.FAIL_ON_UNKNOWN_PROPERTIES=false
spring.jackson.deserialization.READ_DATE_TIMESTAMPS_AS_NANOSECONDS=false

и так далее. Для получения дополнительной информации о том, как настроить средство сопоставления объектов по умолчанию, не заменяя его, см. https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#howto-customize-the-jackson-objectmapper и https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html

person Aceonline    schedule 11.10.2018