Spring:已经为此响应调用了getOutputStream()

我知道还有很多其他post处理同样的错误,但所有这些都是关于JSP / GSP页面或者出于任何其他原因在我的情况下不是很有用。 我正在使用Spring MVC和Thymeleaf。 以下function用于下载文件。

@RequestMapping(value = "/test/download/*", method = RequestMethod.GET) public String getFile(HttpServletResponse response) { ServletOutputStream stream = null; try { stream = response.getOutputStream(); MultipartFile f = test.getFile(); InputStream is = f.getInputStream(); IOUtils.copy(is, stream); response.flushBuffer(); stream.flush(); stream.close(); } catch(Exception ex) { } return "test"; } 

它确实有效,所以它不是太大的问题,但在控制台中,我总是收到以下错误:

 2014-01-10T09:28:09.053+0100 SEVERE Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: getOutputStream() has already been called for this response] with root cause java.lang.IllegalStateException: getOutputStream() has already been called for this response at org.apache.catalina.connector.Response.getWriter(Response.java:638) at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:214) at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:105) at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:105) at org.springframework.security.web.context.SaveContextOnUpdateOrErrorResponseWrapper.getWriter(SaveContextOnUpdateOrErrorResponseWrapper.java:125) at org.thymeleaf.spring3.view.ThymeleafView.renderFragment(ThymeleafView.java:335) at org.thymeleaf.spring3.view.ThymeleafView.render(ThymeleafView.java:190) [...] 

据我所知, getOutputStream()只被调用一次。 此外,整个函数被try-catch -block包围。 所以我想知道,这个错误来自哪里?

如果返回’test’,则在使用响应outputStream返回二进制文件后,指示控制器将您发送到某个视图。 以下是如何管理这个的想法:

从弹簧控制器下载文件

我刚刚遇到了这个问题。

问题是由我的控制器方法在退出时尝试返回String类型(视图名称)引起的 。 当该方法退出时,将启动第二个响应流。

将控制器方法返回类型更改为void可解决问题。

我希望如果其他人遇到这个问题,这会有所帮助。

如果你想发送String那么你可以改变

 return "test"; 

 return null;