2017-02-18 10 views
3

、私はRESTサービスに接続するために春FeignClientsを使用しています私の小さな4クラスgithub project春の雲のネットフリックスとHystrixObservable - コードの場合> JsonMappingException

を参照してください。これは装うクライアントはその基本的な(非非同期)の形で次のようになります。

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

は今、私が観測を使用して、非同期的にそれをやってみたかったです。これに関する情報は、Springのドキュメントではひどく不足しています。small paragraphのみがあり、HystrixCommandを使用するように指示しています。それだけです、説明はなく、sampeコードはありません。

別のブログ記事では、代わりにHystrixObservableを使用するように指示されました。だから、私は試したこと: com.fasterxml.jackson.databind.JsonMappingException:com.netflix.hystrixのインスタンスを作成することはできません

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

いずれかの方法で、HystrixCommandまたはHystrixObservableと、それはエラーが私を投げます.HystrixObservable

スプリングブートは自動的にデコーダをFeignClientに接続してジャクソンを使用してレスポンスをデシリアライズするので、なぜこのエラーが発生するのか理解しています。また、レスポンスを非直列化する型は戻り値から導出されます。

私はカストムデコーダーを構成したり、手動でFeignクライアントを構築しようと試みることができますが、そのような種類のものはSpring Bootの全目的を凌駕します。(ここでは少しの構成ですが)

それで私の質問です:どのようにこれは動作するはずですか?

+0

[ドキュメント](https://github.com/OpenFeign/feign/tree/master/hystrix)に示すように、あなたは(HystrixFeign' '経由で)違ったクライアントを構築する必要があります。 –

+0

はい、手動でFeignクライアントを構築することは可能です。しかし、私の質問は、Spring + Feignです。では、Springが適切なFeignクライアントを生成する方法を教えてください。 Springのドキュメントにはできることが示唆されていますが、いくつかの重要な詳細は除外されています。また、この[ブログ投稿](https://www.voxxed.com/blog/2016/03/netflix-stack-using-spring-boot-part-3-feign/#feignclientwithhystrixobservablewrapper)は、私がやっていることを正確に示しています。 –

答えて

2

HystrixCommand<Product>、またはHystrixObservable<Product>ではなくRxJavaのObservable<Product>またはSingle<Product>のいずれかの戻り値の型を指定した場合、正常に動作するはずです。それはインターフェースだとあなたがあなたのスタックトレースに表示される場合がありますようジャクソンは、デフォルトではそのようなインターフェースとして抽象型にマップしませんので、私はHystrixObservableを使用した理由は動作しないと信じて

は次のとおりです。

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

HystrixCommandしかし、HystrixObservableインターフェイスの実装であるため、Jacksonは簡単にマップすることができます。

Feign's Hystrix moduleHystrixInvocationHandlerをチェックアウトすると、返すことができる他のタイプが表示されます。上記のRxJavaのCompletableと同様です。 Tassos Bassoukosによってリンクされたドキュメントには、そのタイプもリストされています。

非同期で非ブロッキングなものを探しているのであれば、Feignが非同期だがブロックしていると思うので、Feign Vertxをチェックする価値があるかもしれません。ノンブロッキング・ファインについての議論はhereです。

希望に役立ちます!

+0

anwserに感謝します。 Jacksonは、応答のペイロードであるため、HystrixCommandもHystrixObservableもProductをデシリアライズしないでください。要求の戻り値を逆シリアル化しなければならない場合、逆直列化する型は、メソッドの戻り型(この場合はHystrixObservable)から取得されます。しかし、それはここで間違った戦略です。それはジェネリック型を調べるべきです。タイプ消去のおかげで、実行時にはかなり難しいです。 –

0

spring-cloud:1.3。+にアップグレードした後に誰かがこのエラーを表示し始める場合は、hystrix-feignを有効にしてください。

feign.hystrix.enabled=true 

これは、feignがデフォルトでhystrixコマンドで呼び出しをラップしないように追加されました。

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

関連する問題