我发现以下问题试图在SpringBoot控制器中返回照片(两种方法具有相同的行为,但第二种方法返回CompletableFuture)。
方法1:不向outputStream发送任何消息,并且响应为http 200。
@RequestMapping(value = FIND_PHOTO, method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
public void getPhoto(HttpServletResponse response, @PathVariable String id) {
ExceptionalConsumer<String, IOException> photoConsumer = photo -> {
ByteArrayInputStream bais = new ByteArrayInputStream(Base64.getDecoder().decode(photo));
response.setContentType(MediaType.IMAGE_JPEG_VALUE);
StreamUtils.copy(bais, response.getOutputStream());
};
photoService.findPhoto(id) //This returns a CompletableFuture<String>
.thenAccept(photoConsumer);
}
方法2:通过outputStream返回数据。
@RequestMapping(value = FIND_PHOTO, method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE)
public CompletableFuture<Void> getPhoto(HttpServletResponse response, @PathVariable String id) {
ExceptionalConsumer<String, IOException> photoConsumer = photo -> {
ByteArrayInputStream bais = new ByteArrayInputStream(Base64.getDecoder().decode(photo));
response.setContentType(MediaType.IMAGE_JPEG_VALUE);
StreamUtils.copy(bais, response.getOutputStream());
};
return photoService.findPhoto(id)
.thenAccept(photoConsumer);
}
我认为spring有一种等待CompletableFutures等待完成的队列,但是如果方法的返回是void
,那么spring不会意识到异步行为,那么我需要调用{{1 }}或get()
自己。
有人可以确认这是真实的行为还是我的错误?
答案 0 :(得分:0)
如果您不为此处理异常,则不应真正在CompletableFuture上调用get()。...
Spring没有该队列。如果您什么也没有返回,而不必调用join(),并且从方法返回的对象将是CompleatableFuture的T或您可以仅返回可完成的Future,则应该是这样工作的。 >