gpt4 book ai didi

java - 当方法返回类型为 void 时,SpringBoot Controller 中的 CompletableFuture 不起作用

转载 作者:行者123 更新时间:2023-12-01 23:49:48 39 4
gpt4 key购买 nike

我在尝试在 SpringBoot Controller 中返回照片时发现以下问题(两种方法具有相同的行为,但第二个方法返回 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);
}

方法二:通过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不知道异步行为,然后我需要调用我自己的 get()join()

有人可以确认这是真实行为还是我这边有错误吗?

最佳答案

如果你没有处理异常,你不应该真正在 CompletableFuture 上调用 get()...

Spring 没有那个队列。如果您除了必须调用 join() 之外什么都不返回,并且该方法返回的对象将是 T 作为 CompleatableFuture 或者您可以只返回可完成的 future ,那么它应该如何工作,因此您的观察是正确的。 p>

关于java - 当方法返回类型为 void 时,SpringBoot Controller 中的 CompletableFuture 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58224042/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com