2

java.lang.IllegalStateException: getOutputStream() has already been called for this response

Hi I'm getting above exception while m trying to open a pdf file through my java code

Here is my Java code. I am using IText to create pdf

@RequestMapping(value = "/pdf", method = RequestMethod.POST)
public String pdf(ActivitiesForm activitiesForm, Model model,
        HttpSession session,HttpServletResponse response) throws InstanceNotFoundException, IOException,
        DocumentException {

    String PATH = "/home/space/workspace/trainning/Trainning/Performance.pdf";
    // step 1
    Document document = new Document();
    // step 2
     FileOutputStream fos = new FileOutputStream(PATH);
    PdfWriter.getInstance(document,fos);
    // step 3
    document.open();
    // step 4
    PdfPTable table;

    table = new PdfPTable(3);
    table.setWidthPercentage(100);
    PdfPCell cell;

    cell = new PdfPCell(new Phrase("Roll No"));
    cell.setColspan(1);
    // cell.setBorder(Rectangle.NO_BORDER);
    table.addCell(cell);
    cell = new PdfPCell(new Phrase("Name"));
    cell.setColspan(1);
    // cell.setBorder(Rectangle.NO_BORDER);
    table.addCell(cell);
    cell = new PdfPCell(new Phrase("Performance"));
    cell.setColspan(1);
    // cell.setBorder(Rectangle.NO_BORDER);
    table.addCell(cell);

    Integer count = rollService.getRollCount();
    Integer countpts = creditptsService.getPtsCount();

    if (countpts != null) {
        for (Integer i = 1; i <= count; i++) {
            Roll roll = rollService.getRollNoById(Long.parseLong(i
                    .toString()));

            List<Creditpts> creditpts = creditptsService.getRollById(roll
                    .getId());

            Integer performance = 0;

            if (creditpts == null) {

                cell = new PdfPCell(new Phrase("" + roll.getRollno()));
                cell.setColspan(1);
                // cell.setBorder(Rectangle.NO_BORDER);
                table.addCell(cell);

                cell = new PdfPCell(new Phrase("" + roll.getStudentName()));
                cell.setColspan(1);
                // cell.setBorder(Rectangle.NO_BORDER);
                table.addCell(cell);

                cell = new PdfPCell(new Phrase("0"));
                cell.setColspan(1);
                // cell.setBorder(Rectangle.NO_BORDER);
                table.addCell(cell);

            } else {
                Iterator<Creditpts> creIterator = creditpts.iterator();

                while (creIterator.hasNext()) {
                    Creditpts creditpt = creIterator.next();

                    performance += creditpt.getCrdpts();
                }

                cell = new PdfPCell(new Phrase("" + roll.getRollno()));
                cell.setColspan(1);
                // cell.setBorder(Rectangle.NO_BORDER);
                table.addCell(cell);

                cell = new PdfPCell(new Phrase("" + roll.getStudentName()));
                cell.setColspan(1);
                // cell.setBorder(Rectangle.NO_BORDER);
                table.addCell(cell);

                cell = new PdfPCell(new Phrase("" + performance));
                cell.setColspan(1);
                // cell.setBorder(Rectangle.NO_BORDER);
                table.addCell(cell);

            }
        }
    }
    document.add(table);
    document.close();

    fos.close();
    FileInputStream baos = new FileInputStream(PATH);

    // set some response headers
    response.setHeader("Expires", "0");
    response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
    response.setHeader("Pragma", "public");
    response.setContentType("application/pdf");

    response.setContentLength((int) new File(PATH).length());
    OutputStream os = response.getOutputStream();
    byte buffer[] = new byte[8192];
    int bytesRead, i;

    while ((bytesRead = baos.read(buffer)) != -1) {
        os.write(buffer, 0, bytesRead);
    }
    os.flush();
    os.close();
}

I have paste my pdf creation and opening code what i'm doing wrong here m i missing some thing...

Here is full stack trace:

java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:633)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:214)
at javax.servlet.ServletResponseWrapper.getWriter(ServletResponseWrapper.java:105)
at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:125)
at org.apache.jasper.runtime.JspWriterImpl.flushBuffer(JspWriterImpl.java:118)
at org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:336)
at org.apache.jasper.runtime.JspWriterImpl.write(JspWriterImpl.java:353)
at org.apache.jsp.jsp.activity_jsp._jspService(activity_jsp.java:402)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:432)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:593)
at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:530)
at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:229)
at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1265)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1016)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:965)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:859)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:883)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:792)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
cheffe
  • 9,345
  • 2
  • 46
  • 57
Patty31
  • 105
  • 2
  • 2
  • 13
  • 3
    Can you please post the complete `Exception` including the stack trace and also mark in the code where the exception occurs? – Uwe Plonus Jul 08 '13 at 09:41
  • @UwePlonus: exception occurs when I click on the button requesting for pdf file. I can still see dialog box asking me whether to open or save the document. – Patty31 Jul 08 '13 at 09:50
  • 1
    You should not call `os.close()` on an `OutputStream` you didn't create yourself. Does it help? – LaurentG Jul 08 '13 at 09:50
  • @LaurentG: no it didn't helped m still getting the exception – Patty31 Jul 08 '13 at 09:55
  • 1
    Your method returns `String` but I do not see any return statement? If you return a String, it will be used to resolve a JSP view. You have to write on the `OutputStream` yourself or to return a JSP view, but not both. – LaurentG Jul 08 '13 at 09:57
  • @LaurentG I m returning back to the same jsp I'm doing some other stuff that should be returned back to the jsp below pdf code. – Patty31 Jul 08 '13 at 10:03
  • Problem is with this line OutputStream os = response.getOutputStream(); You are getting Outputstream from response. Now again at time of JSP rendering it checks Outputstream has been already used or not. if already used It throws Exception which you are getting. You need to correct your code. – Neeraj Jul 16 '14 at 08:43

3 Answers3

3

Add the following inside the end of the try/catch to avoid the error that appears when the JSP engine flushes the response via getWriter()

out.clear(); // where out is a JspWriter
out = pageContext.pushBody();

This isn't best practice, but it avoids the errors in your logs. Ideally we should do this in Servlet and not in JSP. If you still needs it in JSP, follow above code to get rid off the error.

Manjunath D R
  • 371
  • 2
  • 8
2

You handle the request completely in java code, and then the Spring/container's functionality kicks in trying to handle the same request by rendering some jsp. You need to disable this functionality in this particular case.

user568826
  • 581
  • 5
  • 16
0

As you can see in the stack trace, the JSP calls response.getWriter(), but the exception message says there was a call to response.getOutputStream() before. You cannot call both methods on the same response object.

check below links:

https://stackoverflow.com/a/3540474/2333119

and

https://stackoverflow.com/a/14951581/2333119

Community
  • 1
  • 1
  • 1
    I have read those link they say you need to move your code to servlet from jsp. I have refered these links before too n had implemented my code in java file but no use – Patty31 Jul 08 '13 at 10:20
  • Then check this link. similar problem i guess http://stackoverflow.com/questions/16891792/how-to-read-pdf-file-and-write-it-to-outputstream – Shankari vatsalkumar Jul 08 '13 at 10:54