首页 > 解决方案 > Spring MVC 返回视图和下载文件

问题描述

我正在尝试下载文件并在出现错误时返回相同的视图。

@GetMapping("/report")
public String report() {
    return "report";
}

@PostMapping("/download")
public String download(@RequestParam("from") String from, @RequestParam("to") String to, HttpServletResponse response, Model model) {
   // Validate example
   if (from != null && from.isEmpty()) {
        model.addAttribute("error", "From is required.");
        return "report";
    } else if (to != null && to.isEmpty()) {
        model.addAttribute("error", "To is required.");
        return "report";
    }

   response.setContentType("application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("Content-disposition", "attachment; filename=Report.xlsx");
   Workbook output = new XSSFWorkbook();
   // Populate workbook here from database query
   output.write(response.getOutputStream());
   return "report";
}

如果我让 download() 返回 void 并且我不尝试返回报告视图,则文件下载完美。如果我尝试在出现错误的情况下返回视图,则在验证未通过时它会返回正常。如果验证通过,我得到:

javax.servlet.ServletException: org.apache.jasper.JasperException: java.lang.IllegalStateException: STREAM
    at org.eclipse.jetty.server.handler.HandlerCollection.handle (HandlerCollection.java:162)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle (HandlerWrapper.java:127)
    at org.eclipse.jetty.server.Server.handle (Server.java:516)
    at org.eclipse.jetty.server.HttpChannel.lambda$handle$1 (HttpChannel.java:383)
    at org.eclipse.jetty.server.HttpChannel.dispatch (HttpChannel.java:556)
    at org.eclipse.jetty.server.HttpChannel.handle (HttpChannel.java:375)
    at org.eclipse.jetty.server.HttpConnection.onFillable (HttpConnection.java:273)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded (AbstractConnection.java:311)
    at org.eclipse.jetty.io.FillInterest.fillable (FillInterest.java:105)
    at org.eclipse.jetty.io.ChannelEndPoint$1.run (ChannelEndPoint.java:104)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask (EatWhatYouKill.java:336)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce (EatWhatYouKill.java:313)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce (EatWhatYouKill.java:171)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run (EatWhatYouKill.java:129)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run (ReservedThreadExecutor.java:375)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob (QueuedThreadPool.java:773)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run (QueuedThreadPool.java:905)
    at java.lang.Thread.run (Thread.java:832)
Caused by: org.apache.jasper.JasperException: java.lang.IllegalStateException: STREAM
    at org.apache.jasper.servlet.JspServletWrapper.handleJspException (JspServletWrapper.java:634)
    at org.apache.jasper.servlet.JspServletWrapper.service (JspServletWrapper.java:509)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile (JspServlet.java:386)
    at org.apache.jasper.servlet.JspServlet.service (JspServlet.java:330)
    at org.eclipse.jetty.jsp.JettyJspServlet.service (JettyJspServlet.java:106)
    at javax.servlet.http.HttpServlet.service (HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder$NotAsync.service (ServletHolder.java:1443)
    at org.eclipse.jetty.servlet.ServletHolder.handle (ServletHolder.java:791)
    at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter (ServletHandler.java:1626)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle (ServletHandler.java:548)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle (SecurityHandler.java:620)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle (HandlerWrapper.java:127)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle (ScopedHandler.java:235)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle (SessionHandler.java:1612)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle (ScopedHandler.java:233)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle (ContextHandler.java:1434)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope (ScopedHandler.java:188)
    at org.eclipse.jetty.servlet.ServletHandler.doScope (ServletHandler.java:501)
    at org.eclipse.jetty.server.session.SessionHandler.doScope (SessionHandler.java:1582)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope (ScopedHandler.java:186)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope (ContextHandler.java:1349)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:141)
    at org.eclipse.jetty.server.Dispatcher.include (Dispatcher.java:121)
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel (InternalResourceView.java:163)
    at org.springframework.web.servlet.view.AbstractView.render (AbstractView.java:316)
    at org.springframework.web.servlet.DispatcherServlet.render (DispatcherServlet.java:1373)
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult (DispatcherServlet.java:1118)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch (DispatcherServlet.java:1057)
    at org.springframework.web.servlet.DispatcherServlet.doService (DispatcherServlet.java:943)
    at org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doPost (FrameworkServlet.java:909)
    at javax.servlet.http.HttpServlet.service (HttpServlet.java:707)
    at org.springframework.web.servlet.FrameworkServlet.service (FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service (HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle (ServletHolder.java:791)
    at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter (ServletHandler.java:1626)
    at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter (WebSocketUpgradeFilter.java:228)
    at org.eclipse.jetty.servlet.FilterHolder.doFilter (FilterHolder.java:193)
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter (ServletHandler.java:1601)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle (ServletHandler.java:548)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle (SecurityHandler.java:602)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle (HandlerWrapper.java:127)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle (ScopedHandler.java:235)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle (SessionHandler.java:1612)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle (ScopedHandler.java:233)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle (ContextHandler.java:1434)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope (ScopedHandler.java:188)
    at org.eclipse.jetty.servlet.ServletHandler.doScope (ServletHandler.java:501)
    at org.eclipse.jetty.server.session.SessionHandler.doScope (SessionHandler.java:1582)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope (ScopedHandler.java:186)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope (ContextHandler.java:1349)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle (ContextHandlerCollection.java:191)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle (HandlerCollection.java:146)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle (HandlerWrapper.java:127)
    at org.eclipse.jetty.server.Server.handle (Server.java:516)
    at org.eclipse.jetty.server.HttpChannel.lambda$handle$1 (HttpChannel.java:383)
    at org.eclipse.jetty.server.HttpChannel.dispatch (HttpChannel.java:556)
    at org.eclipse.jetty.server.HttpChannel.handle (HttpChannel.java:375)
    at org.eclipse.jetty.server.HttpConnection.onFillable (HttpConnection.java:273)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded (AbstractConnection.java:311)
    at org.eclipse.jetty.io.FillInterest.fillable (FillInterest.java:105)
    at org.eclipse.jetty.io.ChannelEndPoint$1.run (ChannelEndPoint.java:104)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask (EatWhatYouKill.java:336)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce (EatWhatYouKill.java:313)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce (EatWhatYouKill.java:171)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run (EatWhatYouKill.java:129)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run (ReservedThreadExecutor.java:375)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob (QueuedThreadPool.java:773)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run (QueuedThreadPool.java:905)
    at java.lang.Thread.run (Thread.java:832)
Caused by: java.lang.IllegalStateException: STREAM
    at org.eclipse.jetty.server.Response.getWriter (Response.java:767)
    at org.apache.jasper.runtime.JspWriterImpl.initOut (JspWriterImpl.java:118)
    at org.apache.jasper.runtime.JspWriterImpl.flushBuffer (JspWriterImpl.java:111)
    at org.apache.jasper.runtime.PageContextImpl.release (PageContextImpl.java:176)
    at org.apache.jasper.runtime.JspFactoryImpl.internalReleasePageContext (JspFactoryImpl.java:119)
    at org.apache.jasper.runtime.JspFactoryImpl.releasePageContext (JspFactoryImpl.java:74)
    at org.apache.jsp.WEB_002dINF.views.report_jsp._jspService (report_jsp.java:228)
    at org.apache.jasper.runtime.HttpJspBase.service (HttpJspBase.java:71)
    at javax.servlet.http.HttpServlet.service (HttpServlet.java:790)
    at org.apache.jasper.servlet.JspServletWrapper.service (JspServletWrapper.java:476)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile (JspServlet.java:386)
    at org.apache.jasper.servlet.JspServlet.service (JspServlet.java:330)
    at org.eclipse.jetty.jsp.JettyJspServlet.service (JettyJspServlet.java:106)
    at javax.servlet.http.HttpServlet.service (HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder$NotAsync.service (ServletHolder.java:1443)
    at org.eclipse.jetty.servlet.ServletHolder.handle (ServletHolder.java:791)
    at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter (ServletHandler.java:1626)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle (ServletHandler.java:548)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle (SecurityHandler.java:620)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle (HandlerWrapper.java:127)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle (ScopedHandler.java:235)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle (SessionHandler.java:1612)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle (ScopedHandler.java:233)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle (ContextHandler.java:1434)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope (ScopedHandler.java:188)
    at org.eclipse.jetty.servlet.ServletHandler.doScope (ServletHandler.java:501)
    at org.eclipse.jetty.server.session.SessionHandler.doScope (SessionHandler.java:1582)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope (ScopedHandler.java:186)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope (ContextHandler.java:1349)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:141)
    at org.eclipse.jetty.server.Dispatcher.include (Dispatcher.java:121)
    at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel (InternalResourceView.java:163)
    at org.springframework.web.servlet.view.AbstractView.render (AbstractView.java:316)
    at org.springframework.web.servlet.DispatcherServlet.render (DispatcherServlet.java:1373)
    at org.springframework.web.servlet.DispatcherServlet.processDispatchResult (DispatcherServlet.java:1118)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch (DispatcherServlet.java:1057)
    at org.springframework.web.servlet.DispatcherServlet.doService (DispatcherServlet.java:943)
    at org.springframework.web.servlet.FrameworkServlet.processRequest (FrameworkServlet.java:1006)
    at org.springframework.web.servlet.FrameworkServlet.doPost (FrameworkServlet.java:909)
    at javax.servlet.http.HttpServlet.service (HttpServlet.java:707)
    at org.springframework.web.servlet.FrameworkServlet.service (FrameworkServlet.java:883)
    at javax.servlet.http.HttpServlet.service (HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle (ServletHolder.java:791)
    at org.eclipse.jetty.servlet.ServletHandler$ChainEnd.doFilter (ServletHandler.java:1626)
    at org.eclipse.jetty.websocket.server.WebSocketUpgradeFilter.doFilter (WebSocketUpgradeFilter.java:228)
    at org.eclipse.jetty.servlet.FilterHolder.doFilter (FilterHolder.java:193)
    at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter (ServletHandler.java:1601)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle (ServletHandler.java:548)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle (SecurityHandler.java:602)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle (HandlerWrapper.java:127)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle (ScopedHandler.java:235)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle (SessionHandler.java:1612)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle (ScopedHandler.java:233)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle (ContextHandler.java:1434)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope (ScopedHandler.java:188)
    at org.eclipse.jetty.servlet.ServletHandler.doScope (ServletHandler.java:501)
    at org.eclipse.jetty.server.session.SessionHandler.doScope (SessionHandler.java:1582)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope (ScopedHandler.java:186)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope (ContextHandler.java:1349)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle (ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle (ContextHandlerCollection.java:191)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle (HandlerCollection.java:146)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle (HandlerWrapper.java:127)
    at org.eclipse.jetty.server.Server.handle (Server.java:516)
    at org.eclipse.jetty.server.HttpChannel.lambda$handle$1 (HttpChannel.java:383)
    at org.eclipse.jetty.server.HttpChannel.dispatch (HttpChannel.java:556)
    at org.eclipse.jetty.server.HttpChannel.handle (HttpChannel.java:375)
    at org.eclipse.jetty.server.HttpConnection.onFillable (HttpConnection.java:273)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded (AbstractConnection.java:311)
    at org.eclipse.jetty.io.FillInterest.fillable (FillInterest.java:105)
    at org.eclipse.jetty.io.ChannelEndPoint$1.run (ChannelEndPoint.java:104)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.runTask (EatWhatYouKill.java:336)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce (EatWhatYouKill.java:313)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.tryProduce (EatWhatYouKill.java:171)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run (EatWhatYouKill.java:129)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run (ReservedThreadExecutor.java:375)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob (QueuedThreadPool.java:773)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$Runner.run (QueuedThreadPool.java:905)
    at java.lang.Thread.run (Thread.java:832)

我还尝试让 download() 返回 void 并在验证错误的情况下调用 return(),但这会打开不同的蠕虫罐,因为 download() 的执行没有停止。

我怎样才能做到这一点?

标签: spring-mvcdownload

解决方案


推荐阅读