2017-02-18 42 views
3

Для кода, см мой крошечный 4 класс github projectвесна облако Netflix и HystrixObservable -> JsonMappingException

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

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

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

В другом сообщении в блоге мне сказали вместо этого использовать 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 для десериализации ответа с помощью Jackson. И тип десериализации ответа в происходит от возвращаемого значения.

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

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

+0

Как показано в [документации] (https://github.com/OpenFeign/feign/tree/master/hystrix), вам нужно построить клиентов по-разному (с помощью 'HystrixFeign'). –

+0

Да, можно вручную создать клиентов Feign. Но мой вопрос касается Spring + Feign. Итак, как заставить Spring генерировать подходящих клиентов Fign? Документы Spring позволяют предположить, что это возможно, но некоторые важные детали не учитываются. Кроме того, это [сообщение в блоге] (https://www.voxxed.com/blog/2016/03/netflix-stack-using-spring-boot-part-3-feign/#feignclientwithhystrixobservablewrapper) предлагает именно то, что я делаю. –

ответ

2

Если указать тип возвращаемого значения в качестве HystrixCommand<Product> или либо из RxJava-х Observable<Product> или Single<Product>, а не 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's Hystrix module, вы увидите другие типы, которые он может вернуть; перечисленные выше, а такжеRxJava. В документации, связанной с Tassos Bassoukos, также перечислены типы.

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

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

+0

Спасибо за андерсера. Джексон не должен ни десериализовать HystrixCommand, ни HystrixObservable, а Продукт, потому что это полезная нагрузка в ответе. Где-то возвращаемое значение в запросе должно быть десериализовано, а тип десериализации в него берется из возвращаемого типа метода (в этом случае HystrixObservable). Но это неправильная стратегия. Он должен смотреть на общий тип. Это довольно сложно во время исполнения благодаря стиранию типа. –

0

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

feign.hystrix.enabled=true 

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^