Я обнаружил следующую проблему, пытаясь вернуть фотографию в контроллере 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 не знает об асинхронном поведении, и тогда мне нужно будет вызвать get()
или join()
сам.
Может ли кто-нибудь подтвердить, является ли это реальным поведением или есть ошибка с моей стороны?