2017-02-18 87 views
3

對於代碼,請參閱我的小4類github project春季雲Netflix和HystrixObservable - > JsonMappingException

我使用Spring FeignClients連接到REST服務。這是假死客戶端的樣子在其基本(非異步)形式:

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

現在我想異步做,用觀察到的。關於這方面的信息在Spring文檔中嚴重缺乏,只有一個small paragraph告訴你使用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中,以使用Jackson反序列化響應。反序列化的類型來自返回值。

我可以嘗試配置一個custome解碼器或手動構建Feign客戶端,但這樣做會挫敗Spring Boot的全部用途:它自動工作(儘管在這裏和那裏有一點配置)。

所以我的問題是:這應該如何工作?

+0

作爲[文檔]中示出(https://github.com/OpenFeign/feign/tree/master/hystrix),則需要構造不同的客戶端(通過'HystrixFeign')。 –

+0

是的,可以手動構建Feign客戶端。但我的問題是關於Spring + Feign。那麼如何讓Spring產生合適的Feign客戶端呢?春季文檔表明它可以,但一些重要的細節被忽略。另外這個[博客文章](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 

然而,它是HystrixObservable接口的實現,所以傑克遜可以輕鬆映射到它。

如果您查看Feign's Hystrix module中的HystrixInvocationHandler,您會看到它能夠返回的其他類型;我上面列出的以及RxJava的Completable。由Tassos Bassoukos鏈接的文檔也列出了這些類型。

如果你正在尋找異步和非阻塞的東西,可能值得檢查Feign Vertx,因爲我相信Feign可以是異步但阻塞的。關於非阻塞Feign的討論是here

希望有幫助!

+0

感謝您的支持。 Jackson既不應該對HystrixCommand進行反序列化,也不應該對HystrixObservable進行反序列化,而應該是一個Product,因爲這是響應中的有效載荷。在某個地方,請求中的返回值必須反序列化,並且將其反序列化的類型取自方法的返回類型(本例中爲HystrixObservable)。但這是錯誤的策略。它應該看看通用類型。由於類型擦除,這在運行時非常困難。 –