spring-mvc - 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() 的执行没有停止。
我怎样才能做到这一点?
解决方案
推荐阅读
- react-native - 如何在反应中处理调度后导航
- node.js - 如何让 gulp-better-sass-inheritance 编译所有文件
- angular - 可选字段的Angular 5表单验证
- html - 如何使 Angular 中的 styles.css 不会影响具有该选择器的每个元素?
- azure - Azure AD B2C - b2clogin.com CORS
- java - 我需要什么混合模式才能通过在图像上绘制透明图像来使图像更加透明?
- jquery - 有没有漂亮的 url 的 jQuery 方法
- jenkins - 用于匹配分支名称 Jenkinsfile 的后置条件 Ant 样式模式
- laravel - 如何同步具有多种类型的中间模型?
- php - 未达到最小缓冲区大小的 PHP 刷新