'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