Я использую поток интеграции для вызова веб-службы RESTful следующим образом:
@Bean
IntegrationFlow flow() throws Exception {
return IntegrationFlows.from("inputChannel")
.handle(Http.outboundGateway("http://provider1.com/...")
.httpMethod(HttpMethod.GET)
.expectedResponseType(ItemDTO[].class))
.get();
}
Фактически, приведенный выше код работает отлично. Как я понимаю из документации, исходящий HTTP-шлюз Spring интеграции использует экземпляр RestTemplate для преобразования тела ответа Http в массив ItemDTO
s.
Давайте теперь рассмотрим следующий код:
@Bean
IntegrationFlow flow() throws Exception {
return IntegrationFlows.from("inputChannel")
.handle(Http.outboundGateway("http://provider2.com/...")
.httpMethod(HttpMethod.GET)
.expectedResponseType(String.class))
.<String,String>transform(m -> sirenToHal(m))
.transform(Transformers.fromJson(ItemDTO[].class))
.get();
}
В этом случае тело ответа Http преобразуется в строку, которая передается преобразователю (например, в моем реальном проекте я использую JOLT для преобразования документа сирены в представление ресурсов HAL - JSON). Затем я создаю экземпляр преобразователя для обработки сопоставления JSON с объектами Java. Удивительно, но приведенный выше код не работает (например, в моем проекте трансформатор выдает UnrecognizedPropertyException
).
Причина сбоя, по-видимому, в том, что преобразователь объектов, используемый преобразователем, не настроен таким же образом, как RestTemplate. Интересно, почему преобразователь не использует тот же ObjectMapper, что и экземпляр RestTemplate, или, по крайней мере, почему они не используют ту же конфигурацию (т.е. глобальную конфигурацию загрузки Spring). В любом случае, можно ли настроить ObjectMapper для использования преобразователем?
Обновлять
Я узнал, как настроить отображение объектов трансформера.
Сначала мы создаем и настраиваем экземпляр ObjectMapper Джексона следующим образом:
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
// + any other additional configuration setting
Затем мы создаем экземпляр трансформатора следующим образом (заменяя соответствующую строку в приведенном выше коде):
.transform(Transformers.fromJson(ItemDTO[].class, new Jackson2JsonObjectMapper(mapper)))
Я все еще думаю, что ObjectMapper, используемый трансформатором, должен принимать глобальную конфигурацию загрузки Spring.