Возврат потока с помощью Spring MVC ResponseEntity

У меня есть метод Spring MVC, который возвращает ResponseEntity. В зависимости от конкретных полученных данных иногда требуется вернуть поток данных пользователю. В других случаях он возвращает что-то другое, кроме потока, а иногда и перенаправление. Я определенно хочу, чтобы это был поток, а не байтовый массив, поскольку он может быть большим.

В настоящее время я возвращаю поток, используя следующий фрагмент кода:

HttpHeaders httpHeaders = createHttpHeaders();
IOUtils.copy(inputStream, httpServletResponse.getOutputStream());

return new ResponseEntity(httpHeaders, HttpStatus.OK);

К сожалению, это не позволяет данным Spring HttpHeaders фактически заполнять HTTP-заголовки в ответе. Это имеет смысл, так как мой код записывается в OutputStream, прежде чем Spring получает ResponseEntity.

Было бы очень приятно каким-то образом вернуть ResponseEntity с InputStream, а пусть Spring обработать его. Он также будет параллелен другим путям моей функции, где я могу успешно вернуть ResponseEntity. В любом случае я могу выполнить это с помощью Spring?


Кроме того, я попытался вернуть InputStream в ResponseEntity, чтобы увидеть, примет ли он Spring.

return new ResponseEntity(inputStream, httpHeaders, HttpStatus.OK);

Но это исключает это исключение:

org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation

Я могу заставить свою функцию работать, установив все на HttpServletResponse напрямую, но я хотел бы сделать это только с помощью Spring.

Ответ 1

Spring InputStreamResource работает хорошо. Вам необходимо установить длину контента вручную или, как представляется, Spring пытается прочитать поток для получения Content-Length.

InputStreamResource inputStreamResource = new InputStreamResource(inputStream);
httpHeaders.setContentLength(contentLengthOfStream);
return new ResponseEntity(inputStreamResource, httpHeaders, HttpStatus.OK);

Я никогда не нашел веб-страниц, предлагающих использовать этот класс. Я только догадывался, потому что заметил, что было несколько предложений по использованию ByteArrayResource.