【问题标题】:Reactor Feign cannot deserialize Flux responseReactor Feign 无法反序列化通量响应
【发布时间】:2020-04-07 05:59:31
【问题描述】:

我有以下控制器

@RestController
public void MyController {
  @GetMapping("/foo")
  public Flux<Foo> getFoos() { /* return a flux of Foos*/ }
}

还有一个 Feign 客户端

public interface MyFeignClient {
  @RequestLine("GET /foo")
  Mono<Foo> getFoos();
}

public class MyClients {
  public static MyFeignClient myFeignClient() {
    return ReactorFeign.builder().target(MyFeignClient.class, "http://localhost:8080");
  }
}

但是当我打电话时

StepVerifier.create(myFeignClient.foo())
  .consumeNextWith(foo -> println(foo))
  .verifyCompleted();

我收到了这个错误

java.lang.AssertionError:期望“consumeNextWith”失败 (预期:onNext();实际:onError(feign.FeignException: 不能 反序列化实例 com.example.Foo出 [来源:(BufferedReader)处的 START_ARRAY 令牌;行:1,列:1] 阅读 GET http://localhost:8080/foo))

在 reactor.test.ErrorFormatter.assertionError(ErrorFormatter.java:105) 在 reactor.test.ErrorFormatter.failPrefix(ErrorFormatter.java:94) 在 reactor.test.ErrorFormatter.fail(ErrorFormatter.java:64) 在 reactor.test.ErrorFormatter.failOptional(ErrorFormatter.java:79) 在 reactor.test.DefaultStepVerifierBuilder.lambda$consumeNextWith$1(DefaultStepVerifierBuilder.java:256) 在 reactor.test.DefaultStepVerifierBuilder$SignalEvent.test(DefaultStepVerifierBuilder.java:2112) 在 reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onSignal(DefaultStepVerifierBuilder.java:1408) 在 reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onExpectation(DefaultStepVerifierBuilder.java:1356) 在 reactor.test.DefaultStepVerifierBuilder$DefaultVerifySubscriber.onError(DefaultStepVerifierBuilder.java:1030) 在 reactor.core.publisher.FluxTake$TakeSubscriber.onError(FluxTake.java:138) 在 reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.onError(FluxSubscribeOn.java:157) 在 feign.reactive.ReactiveInvocationHandler$1.request(ReactiveInvocationHandler.java:115) 在 reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.requestUpstream(FluxSubscribeOn.java:131) 在 reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.onSubscribe(FluxSubscribeOn.java:124) 在 feign.reactive.ReactiveInvocationHandler.lambda$invokeMethod$0(ReactiveInvocationHandler.java:99) 在 reactor.core.publisher.FluxSource.subscribe(FluxSource.java:52) 在 reactor.core.publisher.Flux.subscribe(Flux.java:7777) 在 reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194) 在 reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84) 在 reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37) 在 java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) 在 java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:304) 在 java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) 在 java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) 在 java.base/java.lang.Thread.run(Thread.java:834) 被抑制: feign.FeignException:无法反序列化实例 com.example.Foo出 [来源:(BufferedReader)处的 START_ARRAY 令牌;行:1,列:1] 阅读 GET http://localhost:8080/foo 在 feign.FeignException.errorReading(FeignException.java:130) 在 feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:162) 在 feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:80) 在 feign.reactive.ReactiveInvocationHandler$1.request(ReactiveInvocationHandler.java:109) ... 13 更多原因: com.fasterxml.jackson.databind.exc.MismatchedInputException:不能 反序列化实例 com.example.Foo出 [来源:(BufferedReader)处的 START_ARRAY 令牌;行:1,列:1] 在 com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63) 在 com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1343) 在 com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1139) 在 com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1093) 在 com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromArray(BeanDeserializerBase.java:1461) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:185) 在 com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:161) 在 com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4013) 在 com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3063) 在 feign.jackson.JacksonDecoder.decode(JacksonDecoder.java:61) 在 feign.SynchronousMethodHandler.decode(SynchronousMethodHandler.java:183) 在 feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:147) ... 15 更多

我在这里做错了什么?我该如何解决?

【问题讨论】:

    标签: json spring-webflux reactor feign


    【解决方案1】:

    简单的 google 搜索显示 feign 客户端不支持响应式。他们有一个孵化项目试图创造支持

    Add Webflux support issue

    Feign core

    所以来回答你的问题

    “我做错了什么?”

    您选择使用不支持生产者/消费者的 HttpClient。

    “我该如何解决?”

    不使用 feign 客户端,而是使用支持非阻塞操作的 HttpClient,例如 spring WebClient。

    【讨论】:

    • 感谢@Thomas,我正在使用响应式 feign 扩展 github.com/OpenFeign/feign-reactive,但您可能是对的,并非所有问题都已得到修复
    • 对不起,我只是认为你是对的。还没来得及验证
    猜你喜欢
    • 1970-01-01
    • 2021-05-14
    • 2021-01-03
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-31
    相关资源
    最近更新 更多