Spring cloud netflix和HystrixObservable-->;JsonMappingException

Spring cloud netflix和HystrixObservable-->;JsonMappingException,spring,rx-java,hystrix,reactive,feign,Spring,Rx Java,Hystrix,Reactive,Feign,有关代码,请参阅我的tiny 4类 我正在使用SpringFaignClient连接到rest服务。这就是外部客户端的基本(非异步)形式: 现在我想用一个可观察的对象异步地做这件事。Spring文档中严重缺乏这方面的信息,只有一个命令告诉您使用HystrixCommand。仅此而已,没有解释,没有sampe代码 在另一篇博文中,我被告知改用HystrixObservable。所以我试着: @FeignClient(value="localhost:8080/products", decode40

有关代码,请参阅我的tiny 4类

我正在使用SpringFaignClient连接到rest服务。这就是外部客户端的基本(非异步)形式:

现在我想用一个可观察的对象异步地做这件事。Spring文档中严重缺乏这方面的信息,只有一个命令告诉您使用HystrixCommand。仅此而已,没有解释,没有sampe代码

在另一篇博文中,我被告知改用HystrixObservable。所以我试着:

@FeignClient(value="localhost:8080/products", decode404 = true)
public interface ProductClient {
    @RequestMapping(value="/{id}")
    HystrixObservable<Product> getById(@PathVariable("id") String id);
}
@FeignClient(value=“localhost:8080/products”,decode404=true)
公共接口产品客户端{
@请求映射(value=“/{id}”)
HystrixObservable getById(@PathVariable(“id”)字符串id);
}
无论哪种方式,使用HystrixCommand或HystrixObservable,它都会给我带来错误: com.fasterxml.jackson.databind.JsonMappingException:无法构造com.netflix.hystrix.HystrixObservable的实例

我理解它为什么会给出这个错误,因为Spring Boot会自动将解码器附加到假客户端,以使用Jackson反序列化响应。要反序列化响应的类型是从返回值派生的

我可以尝试配置一个自定义解码器或手动构建外部客户端,但这有点违背了Spring Boot的全部目的:它可以自动工作(尽管需要在这里和那里进行一些配置)


因此,我的问题是:这应该如何工作?

如果将返回类型指定为
HystrixCommand
或RxJava的
可观察的
单一的
而不是
HystrixObservable
,那么它应该可以工作

我相信使用
HystrixObservable
不起作用的原因是因为它是一个接口,Jackson默认情况下不会映射到抽象类型,例如接口,正如您在堆栈跟踪中可能看到的:

> abstract types either need to be mapped to concrete types, have custom
> deserializer, or contain additional type information
然而,
HystrixCommand
HystrixObservable
接口的实现,因此Jackson可以很容易地映射到它

如果您签出中的
hystrihandler
,您将看到它能够返回的其他类型;我上面列出的那些,以及RxJava的
Completable
。Tassos Bassoukos链接的文档也列出了这些类型

如果您正在寻找异步和非阻塞的东西,那么可能值得检查一下Feign Vertx,因为我相信Feign可以是异步但阻塞的。关于非阻塞性佯装的讨论是


希望有帮助

如果有人在升级到spring cloud:1.3之后出现此错误,请确保启用了hystrix FIGN

feign.hystrix.enabled=true
这是为了在默认情况下,在hystrix命令中不会包装调用而添加的


如中所示,您需要以不同的方式构建客户端(通过
HystrixFeign
)。是的,可以手动构建外部客户端。但我的问题是关于春天+伪装。那么,如何让Spring生成适当的外部客户机呢?Spring文档建议它可以,但忽略了一些重要的细节。这也正好说明了我在做什么。@AnnevanderBom你能让它工作吗?@BogdanTimofeev不幸的是不能。谢谢你的回答。Jackson既不应该反序列化HystrixCommand,也不应该反序列化HystrixObservable,而是反序列化产品,因为这是响应中的有效负载。在某个地方,请求中的返回值必须反序列化,并且要反序列化的类型取自方法的返回类型(在本例中为HystrixObservable)。但这是错误的策略。它应该关注泛型类型。由于类型擦除,这在运行时相当困难。
feign.hystrix.enabled=true