Spring Cloud Netflix 和 HystrixObservable --> JsonMappingException



有关代码,请参阅我的Tiny 4类GitHub Project

我正在使用弹簧feignclients连接到REST服务。这就是假装客户端在其基本(非Async)形式中的样子:

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

现在,我想使用可观察到的,不时地进行操作。关于此的信息在春季文档中严重缺乏,只有一个小段落告诉您使用HyStrixCommand。仅此而已,没有解释,没有Sampe代码。

在另一篇博客文章中,我被告知使用HyStrixObserable。所以我尝试了:

@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.hysstrix.hysstrixobservable的实例

我理解为什么会出现该错误,因为Spring Boot会自动将解码器附加到Feignclient上,以使用Jackson对响应进行验证。并从返回值得出响应的理想化类型。

我可以尝试配置Custome解码器或手动构建假装客户端,但是这种击败了Spring Boot的全部目的:它可以自动起作用(尽管在这里和那里进行了一些配置)。

所以我的问题是:这应该如何工作?

如果将返回类型指定为 HystrixCommand<Product>或rxjava的Observable<Product>Single<Product>而不是HystrixObservable<Product>,则应起作用。

我相信使用HystrixObservable不起作用的原因是因为它是一个接口,而Jackson不会默认地映射到诸如接口之类的抽象类型,如您在堆栈跟踪中所示:

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

HystrixCommand但是,是HystrixObservable接口的实现,因此杰克逊可以轻松地映射到它。

如果您在假装的HyStrix模块中查看HystrixInvocationHandler,您将看到它能够返回的其他类型;我上面列出的那些以及RXJAVA的Completable。Tassos Bassoukos链接的文档还列出了类型。

如果您正在寻找异步和非障碍物的东西,可能值得签出feign vertx,因为我认为假装可能是异步但封锁的。关于非阻滞假的讨论在这里。

希望有帮助!

如果有人在升级到spring-cloud:1.3。

feign.hystrix.enabled=true

添加了这一点,因此默认情况下,feign不会在hystrix命令中包装呼叫。

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

相关内容

  • 没有找到相关文章

最新更新