Senhores, estou gerando um relatório "jasper" e estou tendo o seguinte problema, a rotina executa normalmente, exibe o PDF no browser, mas a seguinte exception é lançada:
SEVERE: Servlet.service() for servlet action threw exception
java.lang.IllegalStateException: getOutputStream() has already been called for this response
at org.apache.catalina.connector.Response.getWriter(Response.java:610)
at org.apache.catalina.connector.ResponseFacade.getWriter(ResponseFacade.java:198)
Abaixo segue o código da classe que gera o PDF
import java.io.File;
import java.util.HashMap;
import java.util.List;
import javax.servlet.ServletContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JasperRunManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
public class ReportCreator {
public void create(ServletContext sc, HttpServletRequest request, HttpServletResponse response, List dados, String reportName) {
try {
JRDataSource jrds = new JRBeanCollectionDataSource(dados);
// parametros do relatorio
HashMap parameters = new HashMap();
// lendo arquivo jasper
File reportFile = new File(sc.getRealPath("/WEB-INF/classes/br/com/unitelco/reports/" + reportName + ".jasper"));
byte[] bytes = null;
try {
bytes = JasperRunManager.runReportToPdf(reportFile.getPath(), parameters, jrds);
//JasperPrint print = JasperFillManager.fillReport(reportFile.getPath(), parameters, jrds);
//bytes = JasperExportManager.exportReportToPdf(print);
//JasperViewer.viewReport( reportFile.getName() + ".pdf", false );
} catch (Exception e) {
e.printStackTrace();
return;
}
if (bytes != null && bytes.length > 0) {
response.setContentType("application/pdf");
response.setContentLength(bytes.length);
ServletOutputStream ouputStream = response.getOutputStream();
ouputStream.write(bytes, 0, bytes.length);
ouputStream.flush();
ouputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}