Servlet e IReport (PDF)

2 respostas
robinsonbsilva

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();  
		}  
	}

}

2 Respostas

Nabas

Olá robinson, estou com o mesmo problema que você. Vc conseguiu resolver cara? De que jeito?

Valeu

Marky.Vasconcelos

Esse erro é lançado quando voce pega o OutputStream e o PrintWriter do Response.
Voce só pode pegar um e usa-lo.

Criado 19 de setembro de 2008
Ultima resposta 10 de out. de 2008
Respostas 2
Participantes 3