Loop infinito na hora de renderizar o h:dataTable

0 respostas
marcuscarvalho1

Amigos, estou tentando exibir um data table em uma página xhtml. É bem simples: o data table chama um procedimento "getSiscomexImportacaoAlterar()" de meu managed bean (solicitacaoMB), e este, por sua vez, devolve uma arraylist de Solicitacao (meu bean), que é a lista que será exibida na tabela. Não sei por que CATSO, quando mando rodar a página, entra em um loop infinito e eu sou obrigado a reiniciar o NetBeans. Quando vou depurar o código, observo que o método criarMsgDecexSiscomexImportacao roda direitinho e devolve a arrayList. Mas depois, ao invés de carregar a página, o método getSiscomexImportacaoAlterar() é acionado de novo e de novo e de novo e a página não carrega nunca. Era como se ele tentasse carregar a página de novo para devolver o resultado, e, conseqüentemente rodasse o método de novo e entrasse assim em um loop eterno. Se alguém tiver uma luz aí, agradeço!

Segue meu form_texto_msg.xhtml:

<h:panelGrid columns="1" rendered="#{solicitacaoMB.siscomexImportacaoAlterar != null}" > <!-- só renderiza este bloco caso o procedimento do MB não retorne null -->
                    <h:outputText value="b)Alterar:" style="font-size: 12px" />
                    <h:dataTable id="dt1" value="#{solicitacaoMB.siscomexImportacaoAlterar}" var="item" >
                        <h:column headerClass="headerColuna" >
                            <f:facet name="header" >
                                Nome
                            </f:facet>
                            <h:outputText value="#{item.nomeUsuario}" styleClass="coluna" />
                        </h:column>
                        <h:column headerClass="headerColuna2">
                            <f:facet name="header" >
                                CPF
                            </f:facet>
                            <h:outputText value="#{item.cpfUsuario}" styleClass="coluna2" />
                        </h:column>
                        <h:column headerClass="headerColuna3">
                            <f:facet name="header" >
                                Perfil
                            </f:facet>
                            <h:outputText value="#{item.perfilSiscomexImportacao}" styleClass="coluna2" />
                        </h:column>
                        <h:column headerClass="headerColuna4">
                            <f:facet name="header" >
                                Gecex
                            </f:facet>
                            <h:outputText value="#{item.dependenciaUsuario} - #{item.nomeDependenciaUsuario}" styleClass="coluna2" />
                        </h:column>
                        <h:column headerClass="headerColuna2">
                            <f:facet name="header" >
                                CNPJ da Gecex
                            </f:facet>
                            <h:outputText value="#{item.cnpjDependenciaUsuario}" styleClass="coluna2" />
                        </h:column>
                    </h:dataTable>
                </h:panelGrid>

Este é o SolicitacaoMB:

public List<Solicitacao>getSiscomexImportacaoAlterar(){
        SolicitacaoDAO solicitacaoDAO1 = new SolicitacaoDAO();

        return solicitacaoDAO1.criarMsgDecexSiscomexImportacao(2);
    }

E este é o SolicitacaoDAO (que imagino ser o cgrande cagão da história):

public List<Solicitacao> criarMsgDecexSiscomexImportacao(int naturezaId){
        String sql = "";
        sql = "SELECT a.nome AS `nome`, s.matricula_usuario AS `matricula_usuario`, a.CPF AS `cpf`, " +
                 "p.perfil AS `perfil`, a.Prefixo AS `prefixo_gecex`, m.`Dependencia` AS nome_gecex, " +
                 "m.CNPJ AS cnpj " +
                 "FROM site_sca.solicitacao s " +
                 "INNER JOIN site_sca.perfil_siscomex_importacao p " +
                 "ON p.id=s.perfil_siscomex_importacao_id " +
                 "INNER JOIN arh.arh_dados a " +
                 "ON a.Matricula=s.matricula_usuario " +
                 "INNER JOIN mestre.mestre m " +
                 "ON a.Prefixo=m.Prefixo " +
                 "WHERE s.status_id=3 AND s.perfil_siscomex_importacao_id=1 AND s.natureza_id<>1 " +
                 "ORDER BY a.nome";

        Connection con = ConexaoDAO.getConnection();
        PreparedStatement pstm = null;
        ResultSet rs = null;
        Solicitacao solicitacao1 = new Solicitacao();
        ArrayList resultado1 = new ArrayList();
        ArrayList resultado2 = new ArrayList();
        try{
            pstm = con.prepareStatement(sql);
            if(naturezaId !=3)
                pstm.setInt(1, naturezaId);
            rs = pstm.executeQuery();
            while(rs.next()){
                solicitacao1 = new Solicitacao();
                solicitacao1.setNomeUsuario(rs.getString("nome"));
                solicitacao1.setMatriculaUsuario(rs.getString("matricula_usuario"));
                solicitacao1.setCpfUsuario(formataCpf(rs.getString("cpf")));
                solicitacao1.setPerfilSiscomexImportacao(rs.getString("perfil"));
                solicitacao1.setDependenciaUsuario(rs.getInt("prefixo_gecex"));
                solicitacao1.setNomeDependenciaUsuario(rs.getString("nome_gecex"));
                solicitacao1.setCnpjDependenciaUsuario(formataCnpj(rs.getString("cnpj")));

                resultado1.add(solicitacao1);
            }
        } catch (Exception e) {
            logger.error("Não consegui consultar o banco (" + e.getStackTrace() + ").");
        } finally{
            ConexaoDAO.closeConnection(con, null, rs, pstm);
        }
        
        if(resultado1.isEmpty())
            return null;
        else{
            //Descobre o perfil siscomex importação anterior (constante na tabela usuario)
            Iterator<Solicitacao> iterator = resultado1.iterator();
            try{
                while(iterator.hasNext()){
                    sql = "SELECT p.perfil AS `perfil` " +
                          "FROM site_sca.usuario u " +
                          "INNER JOIN site_sca.perfil_siscomex_importacao p " +
                          "ON p.id=u.perfil_siscomex_importacao_id " +
                          "WHERE matricula=?";
                    con = ConexaoDAO.getConnection();
                    pstm = con.prepareStatement(sql);
                    solicitacao1 = iterator.next();
                    pstm.setString(1, solicitacao1.getMatriculaUsuario());
                    rs = pstm.executeQuery();
                    if (rs.first()){
                        rs.next();
                        solicitacao1.setPerfilSiscomexImportacaoAnterior(rs.getString("perfil"));
                    } else
                        solicitacao1.setPerfilSiscomexImportacaoAnterior("sem acesso");

                    resultado2.add(solicitacao1);
                } 
            } catch (Exception e) {
                    logger.error("Não consegui consultar o banco (" + e.getStackTrace() + ").");
            } finally{
                ConexaoDAO.closeConnection(con, null, rs, pstm);
            }

            return resultado2;
        }
    }

Desde já agradeço pela paciência!

Criado 8 de junho de 2011
Respostas 0
Participantes 1