iReport ..gerando relatório da erro Cannot forward after response has been committed

1 resposta
P

iReport …gerando relatório da erro Cannot forward after response has been committed

Olá,

estou usando um servlet e uma classe com interface para gerar relatório
com jasper mais está me dando o erro abaixo

Até gera o relatório mas não estou visualizando onde dá esse erro ???

Se alguém puder me ajudar …

abs

09/02/2009 18:03:38 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet action threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:312)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
	at br.com.XXX.relatorio.servlet.ServletAction.service(ServletAction.java:37)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)
public class R01Action implements Action {
	EntityManager                 manager = null;
	private  EntityManagerFactory emf  = null;
	
	 private static final String CONTENT_TYPE_PDF  = "application/pdf";
	 OutputStream ops = null;  
	 
	public R01Action(){
	}
	public String execute(HttpServletRequest request,HttpServletResponse response) throws SQLException, IOException {
		
		System.out.println("Wait while loadding Report..."); 
		 
		emf = Persistence.createEntityManagerFactory("XXX");
		manager =  emf.createEntityManager();	
   

		
		Session session = (Session) manager.getDelegate();
		Connection con = session.connection();
		try{
		  	
  			Map parameters = new HashMap();
  			System.out.println("Tipo de Grupo = "+request.getParameter("tipo_grupo"));
  			parameters.put("tipo_grupo", Long.valueOf(request.getParameter("tipo_grupo")));
  			
  			String jasper = request.getContextPath()+ "/reports/XXXGrupo001.jasper";   
  			String host = "http://" + request.getServerName() + ":" + request.getServerPort();   
  			
  			URL jasperURL        = new URL(host + jasper);
  			
  			System.out.println("Getting the binary...");   

  			response.setContentType(CONTENT_TYPE_PDF);   
  			byte[] bytes = JasperRunManager.runReportToPdf(jasperURL.openStream(), parameters, con);   

  			 if (bytes != null) {   
  		             ops = response.getOutputStream();   
  		                     System.out.println("Writting binary");   
  		             ops.write(bytes);   
  		             System.out.println("Sending report...");   
  		     }   

		 
		} catch (JRException e) {
			e.printStackTrace();
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}finally{
			con.close();	
			manager.close();
			emf.close();
			
   
	             if (ops != null) {   
	                ops.flush();   
	                ops.close();   
	             }   
	             try {   
	                con.close();   
	             } catch (SQLException ex1) {   
	                ex1.printStackTrace();   
	             }   

			
		}
		
		return null;
	}

}
public class ServletAction extends HttpServlet {
	RequestDispatcher  rd=null;

	public ServletAction() {
	}
	public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       try {
            String acao = req.getParameter("acao");
           
            Class clazz = Class.forName("br.com.relatorio.action." + acao + "Action");
            
          
            Action action = (Action) clazz.newInstance();
            String Mapping = action.execute(req,resp);
            
            rd = req.getRequestDispatcher(Mapping);

            rd.forward(req,resp);
           
       }catch(Exception e){
    	   req.setAttribute("erro", e);
    	   rd = req.getRequestDispatcher("/pagina/erro.jsp");
    	   rd.forward(req,resp);
    	   System.out.println("Erro="+e);
       }
	}   
}

1 Resposta

O

Estou com este mesmo problema. Tenho um servlet (action do struts) que faz a chamada a uma classe que contem o método para gerar o relatório em pdf.

No final do método é feito:

ServletOutputStream sos = response.getOutputStream();
        sos.write(arquivo, 0, arquivo.length);
        sos.flush();
        sos.close();

e após a chamada do método, é dado um forward para o jsp seguinte. Segundo o erro, não pode ter um forward após uma manipulação com o response:

Servlet.service() for servlet action threw exception
java.lang.IllegalStateException: Cannot forward after response has been committed

Alguém conhece uma outra forma de gerar pdf? Sei que google responde, mas até agora, os exemplos que encontrei não foram suficientes para resolver meu problema.

Desde já, obrigada =)

Criado 9 de fevereiro de 2009
Ultima resposta 3 de ago. de 2011
Respostas 1
Participantes 2