Ainda Problema com Struts + JasperReport + Hibernate

0 respostas
J

Salve Pessoal,

Estou procurando bastante mas nao tenho encontrado nada em relacao ao problema que eu tinha descrito aqui: "Em uma aplicacao Struts eu gostaria de gerar o PDF e apresenta-lo em uma nova janela. Na sequencia eu gostaria de direcionar o fluxo para uma pagina onde eu possa apresentar uma mensagem informando se o relatorio foi gerado perfeitamente ou nao".

Depois de quebrar a cabeça acho que o problema esta no HibernateFilter que fecha a conexao com o BD pra mim. Vou colocar as principais partes do codigo abaixo.

public class HibernateFilter implements Filter {

	private static Log log = LogFactory.getLog(HibernateFilter.class);

	public void init(FilterConfig filterConfig) throws ServletException {
		log.info("Servlet filter init, now opening/closing a Session for each request.");
	}

	public void doFilter(ServletRequest request,
						 ServletResponse response,
						 FilterChain chain)
			throws IOException, ServletException {

		// There is actually no explicit "opening" of a Session, the
		// first call to HibernateUtil.beginTransaction() in control
		// logic (e.g. use case controller/event handler) will get
		// a fresh Session.
		try {
			chain.doFilter(request, response);

			// Commit any pending database transaction.
			HibernateUtil.commitTransaction();

		} finally {
			// No matter what happens, close the Session.
			HibernateUtil.closeSession();
		}
	}
	public void destroy() {}
}

Action:

public ActionForward relComleto(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		// Cria uma sessão
		HttpSession session = request.getSession();
		
		// Cria um manipulador para ler o arquivo de propriedades
		MessageResources messageResources = getResources(request);
		
		// Verifica se o usuário realizou o login
    	Usuario usuario = (Usuario) session.getAttribute("usuario");
    	if (usuario == null) {
			log.debug("==&gt Tentativa de acesso a página sem ter realizado login!");
			ActionMessages errors = new ActionMessages();
			errors.add("", new ActionMessage("user.not.login"));
			saveErrors(request, errors);
			
			// Encaminha o processamento
			return mapping.findForward(GLOBAL_FORWARD_login);
    	}
    	
		// Recupera o título do arquivo de propriedades e salva na requisição
		String tit = messageResources.getMessage("tit.pdf");
		setTitulo(request, tit);

		// Constrói um formatador de datas
    	SimpleDateFormat formatador = new SimpleDateFormat("dd/MM/yyyy");
		
    	// Recupera as datas mínimas e máximas disponíveis da sessão como Strings
    	String inicioDisp = (String) session.getAttribute("inicioDisp");
    	String fimDisp = (String) session.getAttribute("fimDisp");
    	
    	// Constrói as datas disponíveis como Date
    	Date inicioDispD = formatador.parse(inicioDisp);
    	Date fimDispD = formatador.parse(fimDisp);

		//Recupera os dados do formulário de login
		PDFForm pdfForm = (PDFForm) form;
		
		// Recupera as datas escolhidas como Strings
		String inicio = pdfForm.getInicio();
		String fim = pdfForm.getFim();
		
		// Constrói as datas escolhidas como Date
		Date dInicio = formatador.parse(inicio);
		Date dFim = formatador.parse(fim);
		
		// Verifica se as datas escolhidas estão no limite permitido
		//	caso não estejam gera uma mensagem de erro e redireciona
		if (dInicio.before(inicioDispD) || dFim.after(fimDispD) ||
				dInicio.after(fimDispD) || dFim.before(inicioDispD)) {
			log.debug("==&gt Datas escolhidas fora do intervalo permitido");
			ActionMessages errors = new ActionMessages();
			errors.add("", new ActionMessage("date.out.limit"));
			saveErrors(request, errors);
			
			// Encaminha o processamento
			return mapping.findForward(LOCAL_FORWARD_relCompleto);
		}

    	// Verifica se existe um token na requisicao
    	if(isTokenValid(request)) {    		
    		// Salva um token na sessão
    		saveToken(request);
    		
    		// HashMap de parâmetros utilizados no relatório. Sempre instanciados
    		Map parameter = new HashMap();
    		parameter.put("inicio", dInicio);
    		parameter.put("fim", dFim);

    		// Constrói a coleção que representa a fonte de dados
    		Collection reportRows = (ArrayList) initializeCollectionCompleta(dInicio, dFim);
    		
    		
    		// Defina a stream de saída
    		ServletOutputStream servletOutputStream = response.getOutputStream();
    		
    		// Define a stream de entrada como o JasperReport compilado
    		InputStream reportStream = getServlet().getServletConfig().
    			getServletContext().getResourceAsStream("/relatorios/DefalhasGeralPojos.jasper");
    		
    		try {
    			// Constrói o DatSource a partir da coleção de pojos
    			JRDataSource datasource = createReportDataSource(reportRows);
    			// Cria o relatório em uma stream
    			JasperRunManager.runReportToPdfStream(reportStream, servletOutputStream, parameter,
    					datasource);

    			// Define que o conteúdo de saída será um pdf
        		response.setContentType("application/pdf");
        		response.setHeader("Content-disposition", "attachment;filename=" + "RelCompleto.pdf");

        		// Fecha o stream de saída
        		//servletOutputStream.flush();
        		//servletOutputStream.close();
    		} catch (Exception e) {
    			// Apresenta a pilha de erros no navegador
    			log.info("Erro na geração do PDF: " + e.getMessage());
    			StringWriter stringWriter = new StringWriter();
    			PrintWriter printerWriter = new PrintWriter(stringWriter);
    			e.printStackTrace(printerWriter);
    			response.setContentType("text/plain");
    			response.getOutputStream().print(stringWriter.toString());
    		}
    	}
    	else {
    		// Armazena a Mensagem de problema na inserção na requisição
    		String msg = messageResources.getMessage("msg.fluxo");
    		request.setAttribute("mensagem", msg);
    	}
    	
	// Encaminha o processamento
    	return mapping.findForward(GLOBAL_FORWARD_mensagem);
    }

Pagina JSP:

<%@ include file="/pages/header.jsp"%>
<!-- ========== Corpo da Página =================================== -->
<tr>
	<td valign="top" align="center" style="padding: 6; background: #ffffdd; border: 1; border-color: #004080; background: navy">
		<b><font size="3" face="Verdana" >
		&lt;c:out value="${titulo}" /&gt;</font></b>
	&lt;/td&gt;		 
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td height="12"&gt; &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td align="left" style="font-size: 90%"&gt;&lt;html:errors /&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
	&lt;td align="center" valign="center"&gt;
		&lt;table border="1" width="100%" style="padding: 24; background: #ffffdd; font-size: 90%"&gt;
			&lt;html:form action="/relPDF" onsubmit="return validatePDFForm(this);"&gt;
				&lt;!-- ===[ Campo hidden necessário para "enganar" o validador ]=== --&gt;
				&lt;html:hidden property="idTipoElemento" value="1"/&gt;	
				&lt;tr style="color: #0000a0; background-color: #fffa91;"&gt;
					&lt;td align="center"&gt;<b>&lt;fmt:message key="tab.semfiltros"/&gt;</b>&lt;/td&gt;
				&lt;/tr&gt;
				&lt;tr&gt;
					&lt;td&gt;
						&lt;table border="0" width="100%" id="table1"&gt;
							&lt;tr&gt;
								&lt;td width="170" height="23" align="left"&gt;<b>&lt;fmt:message key="tit.periodoDisp"/&gt;</b>&lt;/td&gt;
								&lt;td width="20" height="23" align="left"&gt;&lt;fmt:message key="tit.inicio"/&gt;&lt;/td&gt;
								&lt;td height="23" align="left"&gt;
									&lt;html:text name="PDFForm" property="inicioD" size="8" value="${inicioDisp}" disabled="true" style="text-align: center;"/&gt;
								&lt;/td&gt;
								&lt;td height="23" width="20" align="left"&gt;&lt;fmt:message key="tit.final"/&gt;&lt;/td&gt;
								&lt;td height="23" align="left"&gt;
									&lt;html:text name="PDFForm" property="fimD" size="8" value="${fimDisp}" disabled="true" style="text-align: center;"/&gt;
								&lt;/td&gt;
							&lt;/tr&gt;
							&lt;tr&gt;
								&lt;td width="170" height="23" align="left"&gt;<b>&lt;fmt:message key="tit.periodoSel"/&gt;</b>&lt;/td&gt;
								&lt;td width="20" height="23" align="left"&gt;&lt;fmt:message key="tit.inicio"/&gt;&lt;/td&gt;
								&lt;td height="23" align="left"&gt;
									&lt;html:text name="PDFForm" property="inicio" size="8" /&gt;
									<a ><img     ></a><br>
								&lt;/td&gt;
								&lt;td height="23" width="20" align="left"&gt;&lt;fmt:message key="tit.final"/&gt;&lt;/td&gt;
								&lt;td height="23" align="left"&gt;
									&lt;html:text name="PDFForm" property="fim" size="8" /&gt;
									<a ><img     ></a><br>
								&lt;/td&gt;
							&lt;/tr&gt;
						&lt;/table&gt;
					&lt;/td&gt;
				&lt;/tr&gt;
				&lt;!-- Botões da página --&gt;
				&lt;tr align="center" style="background-color: #c4c4e1;"&gt;
					&lt;td&gt;
						&lt;html:submit property="submit"&gt;&lt;fmt:message key="button.relcomp"/&gt;&lt;/html:submit&gt;
						&lt;html:cancel property="submit"&gt;&lt;fmt:message key="button.cancel"/&gt;&lt;/html:cancel&gt;
					&lt;/td&gt;
				&lt;/tr&gt;
				&lt;!-- Begin Validator Javascript Function--&gt;
				&lt;html:javascript formName="PDFForm"  dynamicJavascript="true" staticJavascript="true"/&gt;
				&lt;!-- End of Validator Javascript Function--&gt;
			&lt;/html:form&gt;
		&lt;/table&gt;
	&lt;/td&gt;
&lt;/tr&gt;

&lt;script language="JavaScript"&gt;
	&lt;!-- // create calendar object(s) just after form tag closed
		 // specify form element as the only parameter (document.forms['formname'].elements['inputname']);
		 // note: you can have as many calendar objects as you need for your application
		var cal1 = new calendar1(document.forms['PDFForm'].elements['inicio']);
		cal1.year_scroll = true;
		cal1.time_comp = false;
		var cal2 = new calendar1(document.forms['PDFForm'].elements['fim']);
		cal2.year_scroll = true;
		cal2.time_comp = false;
	//--&gt;
&lt;/script&gt;
&lt;!-- ========== Corpo da Página =================================== --&gt;
&lt;%@ include file="/pages/footer.txt"%&gt;

O stackTrace do erro eh:

ERROR [http-8080-Processor23] (StandardWrapperValve.java:260) - 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:313)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
	at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
	at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at br.com.bandeirante.util.HibernateFilter.doFilter(HibernateFilter.java:47)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
	at java.lang.Thread.run(Unknown Source)
ERROR [http-8080-Processor23] (StandardWrapperValve.java:260) - 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:313)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:301)
	at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
	at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
	at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at br.com.bandeirante.util.HibernateFilter.doFilter(HibernateFilter.java:47)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
	at java.lang.Thread.run(Unknown Source)

Da pra ver que o erro esta dando no HibernateFilter.java:47.

Sera que alguem tem alguma ideia pra me ajudar?

Obrigado,

celso

Criado 9 de maio de 2007
Respostas 0
Participantes 1