我正在尝试使用 Spring WebFlux WebClient获取值(字符串) (使用 SpringBoot 版本 2.4.5)
\n@GetMapping("/test")\npublic Mono<String> getData(){\n WebClient webClient = WebClient.create("http://localhost:9999");\n Mono<String> stringMono = webClient.get()\n .uri("/some/thing")\n .retrieve()\n .bodyToMono(String.class);\n stringMono.subscribe( System.out::println);\n System.out.println("Value : " + stringMono.block()); // this doesn\'t work, expecting to return ResponseBody as "Hello World" ,\n return stringMono;\n}\nRun Code Online (Sandbox Code Playgroud)\n但低于错误
\n2021-05-11 20:02:15.521 ERROR 55613 --- [ctor-http-nio-2] a.w.r.e.AbstractErrorWebExceptionHandler : [19114471-1] 500 Server Error for HTTP GET "/test"\njava.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-nio-2\n at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:83) ~[reactor-core-3.4.3.jar:3.4.3]\n Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: \nError …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Webflux将生成的文件流式传输到另一个位置,但是,如果文件的生成遇到错误,则api会返回成功,但是DTO会在生成文件而不是文件本身时详细说明错误.这是使用一个非常古老和设计不佳的api所以请原谅使用post和api设计.
来自api调用(exchange())的响应是ClientResponse.从这里我可以使用bodyToMono转换为ByteArrayResource,它可以流式传输到文件,或者,如果创建文件时出错,那么我也可以使用bodyToMono转换为DTO.但是,我似乎无法做任何事情或取决于ClientResponse标题的内容.
在运行时我得到一个IllegalStateException引起的
block()/ blockFirst()/ blockLast()是阻塞,在线程reactor-http-client-epoll-12中不支持
我认为我的问题是我不能在同一个函数链中两次调用block().
我的代码片段是这样的:
webClient.post()
.uri(uriBuilder -> uriBuilder.path("/file/")
.queryParams(params).build())
.exchange()
.doOnSuccess(cr -> {
if (MediaType.APPLICATION_JSON_UTF8.equals(cr.headers().contentType().get())) {
NoPayloadResponseDto dto = cr.bodyToMono(NoPayloadResponseDto.class).block();
createErrorFile(dto);
}
else {
ByteArrayResource bAr = cr.bodyToMono(ByteArrayResource.class).block();
createSpreadsheet(bAr);
}
}
)
.block();
Run Code Online (Sandbox Code Playgroud)
基本上我想根据标头中定义的MediaType以不同方式处理ClientResponse.
这可能吗?