【发布时间】:2013-12-18 11:05:17
【问题描述】:
我有一个返回 ResponseEntity 的 Spring MVC 方法。根据检索到的具体数据,它有时需要向用户返回数据流。有时它会返回流以外的东西,有时还会返回重定向。我绝对希望这是一个流而不是字节数组,因为它可能很大。
目前,我使用以下 sn-p 代码返回流:
HttpHeaders httpHeaders = createHttpHeaders();
IOUtils.copy(inputStream, httpServletResponse.getOutputStream());
return new ResponseEntity(httpHeaders, HttpStatus.OK);
不幸的是,这不允许 Spring HttpHeaders 数据实际填充响应中的 HTTP 标头。这是有道理的,因为我的代码在 Spring 收到 ResponseEntity 之前写入了 OutputStream。
以某种方式返回 ResponseEntity 和 InputStream 并让 Spring 处理它会非常好。它还将与我可以成功返回ResponseEntity 的函数的其他路径平行。无论如何我可以用 Spring 完成这个吗?
另外,我确实尝试在 ResponseEntity 中返回 InputStream 只是为了看看 Spring 是否会接受它。
return new ResponseEntity(inputStream, httpHeaders, HttpStatus.OK);
但它会抛出这个异常:
org.springframework.web.HttpMediaTypeNotAcceptableException: Could not find acceptable representation
我可以通过直接在HttpServletResponse 上设置所有内容来使我的功能正常工作,但我只想使用 Spring 来执行此操作。
【问题讨论】:
-
我怀疑 Spring 不知道如何将 InputStream 主体转换为 AFAIK 的响应,默认情况下没有 HttpMessageConverter 可以与 InputStreams 一起使用。也许尝试注册一个与 InputStream 一起使用的自定义 HttpMessageConverter。 ByteArrayHttpMessageConverter 应该可以满足您的大部分需求。
-
你试过@ResponseBody注解吗?
-
我的 MVC 方法上确实有 @ResponseBody 注释。
标签: java spring servlets spring-mvc