gpt4 book ai didi

Spring Cloud Netflix 和 Hystrix Observable --> JsonMappingException

转载 作者:行者123 更新时间:2023-12-02 06:35:36 25 4
gpt4 key购买 nike

有关代码,请参阅我的小型 4 类 github project

我正在使用 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。仅此而已,没有解释,没有示例代码。

在另一篇博文中,我被告知要使用 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 反序列化响应。响应反序列化的类型是从返回值派生的。

我可以尝试配置一个自定义解码器或手动构建 Feign 客户端,但这违背了 Spring Boot 的全部目的:它自动工作(尽管到处都有一些配置)。

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

最佳答案

如果将返回类型指定为HystrixCommand<Product>或 RxJava 的 Observable<Product> 之一或Single<Product>而不是HystrixObservable<Product>它应该可以工作。

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

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

HystrixCommand然而,是 HystrixObservable 的实现接口(interface),因此 Jackson 可以轻松映射到它。

如果您查看HystrixInvocationHandlerFeign's Hystrix module ,您将看到它能够返回的其他类型;我上面列出的以及 RxJava 的 Completable 。 Tassos Bassoukos 链接的文档也列出了这些类型。

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

希望有帮助!

关于Spring Cloud Netflix 和 Hystrix Observable --> JsonMappingException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42320242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com