Reactor Feign не может десериализовать отклик Flux

У меня следующий контроллер

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

И притворный клиент

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: ожидание «takeNextWith» не удалось (ожидалось: onNext (); фактическое: onError (feign.FeignException: невозможно десериализовать экземпляр com.example.Foo из токена START_ARRAY в [Источник: (BufferedReader); строка: 1, столбец: 1 ] чтение GET http://localhost:8080/foo))

Что я здесь сделал не так? Как я могу это исправить?

Простой поиск в Google показывает, что имитирующий клиент не поддерживает реактивность. У них есть инкубационный проект, пытающийся создать поддержку


person ntviet18    schedule 13.12.2019    source источник


Ответы (1)


Добавить проблему поддержки Webflux

Feign core

Итак, чтобы ответить на ваши вопросы

"Что я сделал не так?"

Вы выбрали HttpClient, который не поддерживает производителей / потребителей.

"Как я могу это исправить?"

Не используя фальшивый клиент, а вместо этого используйте HttpClient, который поддерживает неблокирующие операции, например, Spring WebClient.

спасибо @Thomas, я использую расширение reactive feign github.com/OpenFeign/feign-reactive , но вы, вероятно, правы насчет того, что не все проблемы были устранены

person Toerktumlare    schedule 14.12.2019
comment
извини, я просто думаю, что ты прав. Еще не успел это проверить - person ntviet18; 14.12.2019
comment
в response.test.ErrorFormatter.assertionError (ErrorFormatter.java:105) в response.test.ErrorFormatter.failPrefix (ErrorFormatter.java:94) в response.test.ErrorFormatter.fail (ErrorFormatter.java:64) в response.test. ErrorFormatter.failOptional (ErrorFormatter.java:79) в response.test.DefaultStepVerifierBuilder.lambda $ consumerNextWith $ 1 (DefaultStepVerifierBuilder.java:256) в response.test.DefaultStepVerifierBuilder $ signalEvent12. 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) в response.core.publisher.FluxSubscribeOn $ SubscribeOnSubs criber.onError (FluxSubscribeOn.java:157) в feign.reactive.ReactiveInvocationHandler $ 1.request (ReactiveInvocationHandler.java:115) в response.core.publisher.FluxSubscribeOn $ SubscribeOnSubscriber.request.java.jsubscribeOnSubscriber. publisher. response.core.publisher.Flux.subscribe (Flux.java:7777) по адресу response.core.publisher.FluxSubscribeOn $ SubscribeOnSubscriber.run (FluxSubscribeOn.java:194) по адресу response.core.scheduler.WorkerTask.call (WorkerTask.call) 84) в response.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 (Schedul edThreadPoolExecutor.java:304) в java.base / java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1128) в java.base / java.util.concurrent.ThreadPoolExeruno.java.concurrent. в java.base / java.lang.Thread.run (Thread.java:834) Подавлено: feign.FeignException: невозможно десериализовать экземпляр _5_ из токена START_ARRAY в [Источник: (BufferedReader); строка: 1, столбец: 1] чтение GET http://localhost:8080/foo при притворстве. FeignException.errorReading (FeignException.java:130) в feign.SynchronousMethodHandler.executeAndDecode (SynchronousMethodHandler.java:162) в feign.SynchronousMethodHandler.invoke ($ SynchronousMethodHandler.java.Inest. 109) ... еще 13 Причина: com.fasterxml.jackson.databind.exc.MismatchedInputException: невозможно десериализовать экземпляр _6_ из токена START_ARRAY в [Источник: (BufferedReader); строка: 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.DeserialBextResaBindexml.deeserialFreeDataDataDataSubscribe.com. (BeanDeserializerBase.java:1461) в com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther (BeanDeserializer.java:185) в com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize.java: com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose (ObjectMapper.java:4013) в com.fasterxml.jackson.databind.ObjectMapper.read Значение (ObjectMapper.java:3063) в feign.jackson.JacksonDecoder.decode (JacksonDecoder.java:61) в feign.SynchronousMethodHandler.decode (SynchronousMethodHandler.java:183) в feign.SynchronousMethod14HandlerDecode. .. еще 15 - person ntviet18; 16.12.2019