读取POST正文:java.lang.IllegalStateException:只允许一个连接接收订阅者

时间:2018-10-02 07:35:26

标签: spring-webflux

在Spring Webflux中,当我阅读POST正文并尝试使用它时,总是会从标题中导致IllegalStateException。

代码在这里:

  @Bean
  public RouterFunction<ServerResponse> selectByPost(SasoSecurityFacade solrHandler) {
    return RouterFunctions.route(RequestPredicates.POST("/v1/{collection}/select")
                                     .and(RequestPredicates.accept(MediaType.APPLICATION_JSON)), request -> request.bodyToMono(String.class)
        .flatMap(s -> {
          System.out.println(s);
          return ServerResponse.ok()
              .syncBody(s);
        }));
  }

对服务器的请求也很重要(事实证明):

curl 'https://<myserver>:9443/v1/banana-int/select' -H 'Pragma: no-cache' -H 'Origin: https://<myserver>:9443' -H 'Accept-Encoding: gzip, deflate, br' -H 'Accept-Language: de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7' -H 'User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36' -H 'Content-type: application/x-www-form-urlencoded' -H 'Accept: application/json, text/plain, */*' -H 'Cache-Control: no-cache' -H 'Referer: https://<myserver>:9443/banana/src/index.html' -H 'Connection: keep-alive' -H 'DNT: 1' --data 'q=*:*&rows=20&wt=json' --compressed

我在做什么错?我该如何调试?还有谁在阅读我的帖子正文,以便得到此错误消息?

1 个答案:

答案 0 :(得分:3)

您发送的请求是POST表单请求,HiddenHttpMethodFilter会自动读取该请求。如果通过"_method"参数指定了备用方法,则此过滤器将消耗表单数据以使HTTP方法发生变异。

在这种情况下,使用WebFlux批注/功能中专用的request.formData() API来使用表单数据是最佳选择,它会缓存以备将来使用,并且不会触发新的订阅。

如果您希望完全禁用此行为,请you'll be able to set a property in Spring Boot 2.1