Поддерживает ли Springboot webflux отправку запроса Flux <Object>с клиента на сервер? - PullRequest
0 голосов
/ 31 мая 2018

Служба поддержки Springboot webflux отправляет запрос Flux с клиента на сервер?

Из моего теста я могу получить ответ Flux с сервера, но как я могу отправить запрос Flux на сервер?

Серверсторона:

 @PostMapping(value = "/stream/numbers2", produces = MediaType.APPLICATION_STREAM_JSON_VALUE,
      consumes = MediaType.APPLICATION_STREAM_JSON_VALUE)
  public Flux<StreamNumber> streamNumbers2(@RequestBody Publisher<Integer> request)
      throws InterruptedException {
    log.info("streamNumbers API ");

    return Flux.from(request).map(item -> {
      try {
        Thread.sleep(1000);
        StreamNumber sn = new StreamNumber();
        sn.setOriginNumber(item);
        sn.setNewNumber(item + 1);
        sn.setOperation("Plus 1");
        return sn;
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
      return new StreamNumber(0, 0, "Error");
    }).doOnNext(item -> log.info("Number: {}", item));
  }

сторона клиента:

  public void testPost() throws Exception {
    log.info("Test webflux post flux");
    WebClient webClient = WebClient.create("http://localhost:8080/webflux/stream/numbers2");
    Flux<Integer> request = Flux.just(1, 2, 3, 4, 5, 6, 7, 8);

    webClient.post().contentType(MediaType.APPLICATION_STREAM_JSON)
        .body(request, Integer.class)
        .accept(MediaType.APPLICATION_STREAM_JSON)
        .retrieve()
        .bodyToFlux(StreamNumber.class)
        .map(item -> {
          log.info("result: {}", item.toString());
          return item;
        }).collectList().block();
  }

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

[21:25:28.555] [ERROR] [http-nio-8080-exec-5] - Forwarding to error page from request [/webflux/stream/numbers2] due to exception [Type definition error: [simple type, class org.reactivestreams.Publisher]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.reactivestreams.Publisher` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
 at [Source: (PushbackInputStream); line: 1, column: 1]]
org.springframework.http.converter.HttpMessageConversionException: Type definition error: [simple type, class org.reactivestreams.Publisher]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.reactivestreams.Publisher` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information
 at [Source: (PushbackInputStream); line: 1, column: 1]
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.readJavaType(AbstractJackson2HttpMessageConverter.java:238) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.read(AbstractJackson2HttpMessageConverter.java:223) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:206) ~[spring-webmvc-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:157) ~[spring-webmvc-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:130) ~[spring-webmvc-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:124) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:161) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:131) ~[spring-web-5.0.6.RELEASE.jar:5.0.6.RELEASE]
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) ~[spring-webmvc-5.0.6.RELEASE.jar:5.0.6.RELEASE]

1 Ответ

0 голосов
/ 01 июня 2018

В стековой трассировке предполагается, что вы используете Spring MVC, а не Spring WebFlux.Пожалуйста, проверьте ваши зависимости и убедитесь, что Spring MVC не является транзитивной зависимостью.

Если Spring Boot обнаруживает MVC и WebFlux в пути к классам, MVC вступит во владение.

...