【发布时间】:2023-02-08 17:19:34
【问题描述】:
我正在创建一个返回图像的 Spring WebFlux 控制器。基于类似的问题,我在下面尝试了这个选项。
@RestController
@RequestMapping(value = "/image/*")
public class ImageController {
@RequestMapping(method = RequestMethod.GET, produces = MediaType.IMAGE_PNG_VALUE)
protected void doGet(ServerHttpRequest request, ServerHttpResponse response) {
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
DataBuffer imageData = response.bufferFactory().wrap(barr);
//returns empty content in response
//response.writeWith(Flux.just(imageData));
//returns valid image
response.writeWith(Flux.just(imageData)).block();
} catch (Exception e) {
e.printStackTrace();
}
}
图像有效,我还可以看到 DataBuffer 有字节。但是,它不会将响应发送回客户端。
对该服务的响应是成功的(状态 200),但负载为空(0 字节)。
任何人都可以在这里识别错误吗?
[更新]
我通过添加对块的调用让控制器返回图像:
response.writeWith(Flux.just(imageData)).block();
我还看到它通过调用 subscribe() 起作用:
response.writeWith(Flux.just(imageData)).subscribe();
这种控制器的正确方法是什么?这是否等同于 Stream 上的 flush() 调用? WebFlux 框架不应该在控制器方法完成后阻塞或刷新响应对象吗?
类似问题:
How to write messages to http body in Spring webflux WebExceptionHandlder
【问题讨论】:
-
永远不要阻塞,因为它会严重损害性能。仅当您是最终消费者时才订阅。不要返回 void,反应函数不应该返回 void,而是返回
Mono<Void>
标签: java spring spring-webflux reactive