方法返回类型为空时,SpringBoot控制器中的CompletableFuture无法工作

时间:2019-10-03 17:18:35

标签: java spring spring-boot spring-mvc

我发现以下问题试图在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()自己。

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

1 个答案:

答案 0 :(得分:0)

如果您不为此处理异常,则不应真正在CompletableFuture上调用get()。...

Spring没有该队列。如果您什么也没有返回,而不必调用join(),并且从方法返回的对象将是CompleatableFuture的T或您可以仅返回可完成的Future,则应该是这样工作的。 >