Spring Cloud Netflix и HystrixObservable - ›JsonMappingException

Код см. В моем крошечном проекте github, состоящем из четырех классов.

Я использую Spring FeignClients для подключения к сервису отдыха. Вот как выглядит клиент Feign в его базовой (неасинхронной) форме:

@FeignClient(value="localhost:8080/products", decode404 = true)
public interface ProductClient {
    @RequestMapping(value="/{id}")
    Product getById(@PathVariable("id") String id);
}

Теперь я хотел сделать это асинхронно, используя Observable. Информация об этом сильно отсутствует в документации Spring, есть только небольшой абзац, который говорит вам использовать HystrixCommand. Все, без объяснений, без кода сампе.

В другом сообщении в блоге мне сказали использовать вместо этого HystrixObservable. Итак, я попробовал это:

@FeignClient(value="localhost:8080/products", decode404 = true)
public interface ProductClient {
    @RequestMapping(value="/{id}")
    HystrixObservable<Product> getById(@PathVariable("id") String id);
}

В любом случае, при использовании HystrixCommand или HystrixObservable возникает ошибка: com.fasterxml.jackson.databind.JsonMappingException: не удается создать экземпляр com.netflix.hystrix.HystrixObservable

Я понимаю, почему он выдает эту ошибку, поскольку Spring Boot автоматически подключает декодер к FeignClient для десериализации ответа с помощью Джексона. И тип, в который будет десериализоваться ответ, является производным от возвращаемого значения.

Я мог бы попытаться сконфигурировать индивидуальный декодер или вручную создать клиентов Feign, но такой вид противоречит всей цели Spring Boot: он работает автоматически (хотя и с небольшой конфигурацией здесь и там).

Итак, мой вопрос: как это должно работать?


person Anne van der Bom    schedule 18.02.2017    source источник
comment
Как показано в документации, вам нужно создавать клиентов по-другому (через HystrixFeign).   -  person Tassos Bassoukos    schedule 18.02.2017
comment
Да, можно вручную создать клиентов Feign. Но у меня вопрос о Spring + Feign. Итак, как заставить Spring генерировать правильных клиентов Feign? Документы Spring предполагают, что это возможно, но некоторые важные детали опущены. Также этот блог сообщение предлагает именно то, что я делаю.   -  person Anne van der Bom    schedule 19.02.2017
comment
@AnnevanderBom удалось ли вам заставить его работать?   -  person Bogdan Timofeev    schedule 17.05.2019
comment
@BogdanTimofeev К сожалению, нет.   -  person Anne van der Bom    schedule 28.05.2019


Ответы (2)


Если вы укажете тип возврата как HystrixCommand<Product> или любой из Observable<Product> или Single<Product> RxJava, а не HystrixObservable<Product>, он должен работать.

Я считаю, что причина, по которой использование HystrixObservable не работает, заключается в том, что это интерфейс, и Джексон не будет отображать абстрактные типы, такие как интерфейсы по умолчанию, как вы могли видеть в трассировке стека:

> abstract types either need to be mapped to concrete types, have custom
> deserializer, or contain additional type information

HystrixCommand, однако, является реализацией интерфейса HystrixObservable, поэтому Джексон может легко сопоставить его.

Если вы посмотрите HystrixInvocationHandler в Модуль Feign Hystrix, вы увидите другие типы, которые он может возвращать; те, которые я перечислил выше, а также Completable от RxJava. В документации, на которую ссылается Тассос Басукос, также перечислены типы.

Если вы ищете что-то асинхронное и неблокирующее, возможно, стоит проверить Feign Vertx, поскольку я считаю, что Feign может быть асинхронным, но блокирующим. Обсуждение неблокирующего Feign находится здесь.

Надеюсь, это поможет!

person Jack Harris    schedule 12.03.2017
comment
Спасибо за ответ. Джексону следует десериализовать не HystrixCommand или HystrixObservable, а Product, потому что это полезная нагрузка в ответе. Где-то возвращаемое значение в запросе должно быть десериализовано, а тип для десериализации берется из возвращаемого типа метода (в данном случае HystrixObservable). Но здесь это неправильная стратегия. Следует смотреть на универсальный тип. Что довольно сложно во время выполнения из-за стирания типа. - person Anne van der Bom; 17.03.2017

Если кто-то начинает получать эту ошибку после обновления до spring-cloud: 1.3. +, Убедитесь, что у вас включен hystrix-feign.

feign.hystrix.enabled=true

Это было добавлено, чтобы по умолчанию fign не переносил вызовы в команды hystrix.

https://github.com/spring-cloud/spring-cloud-netflix/issues/1277

person Lukasz Krawiec    schedule 25.05.2017