'Spring MVC return view and download file
I am trying to download a file and return back to the same view in case of errors.
@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";
}
If I make download() return void and I do not try ever to go back to the report view, the file downloads perfectly. If I try to return a view in case of errors, it returns back fine when validation does not pass. If validation passes, I get:
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)
I also tried to make download() return void and call return() in case of validation errors, but that opened a different can of worms as execution of download() did not stop.
How can I achieve this?
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
