Вчера я начал с обновления 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. Однако новый код имеет больше смысла для меня.
Я все еще пытаюсь добиться лучшего понимания и найти правильный подход