RichFaces, problema de render apos erro de validação

4 respostas
cleriston

Olá a todos!

Estou estudando JSF+RichFaces e estou com uma duvida.
Fiz um formulário com um <h:selectOneMenu .../> onde o usuário seleciona um país. Se o país selecionado possui "Estados" cadastrados no banco gostaria que aparecesse um outro <h:selectOneMenu .../> com os estados. Caso o país não tenha estados cadastrados nos banco, gostaria que é aparecesse um <h:inputText .../> para o usuário digitar o estado.

Fiz desta maneira

&lt;h:outputLabel value="#{msg.pais}" for="pais"/&gt;                        
&lt;h:selectOneMenu id="pais" value="#{usuarioMB.usuario.pais.id}" immediate="true"&gt;
    &lt;f:selectItems value="#{usuarioMB.paises}"/&gt;                            
    &lt;a4j:support event="onblur" ajaxSingle="true" action="#{usuarioMB.showEstados}" reRender="status,status1,panel1,panel2"/&gt;
&lt;/h:selectOneMenu&gt;                        

&lt;h:outputLabel value="#{msg.estado}" for="estado"/&gt;
&lt;h:panelGroup&gt;
    &lt;a4j:outputPanel id="panel1"&gt;
        &lt;h:inputText id="estado" value="#{usuarioMB.usuario.estado}" maxlength="30" rendered="#{!usuarioMB.exibeEstados}"/&gt;                        
    &lt;/a4j:outputPanel&gt;                  
    &lt;a4j:outputPanel id="panel2"&gt;
        &lt;h:selectOneMenu id="estado_combo" value="#{usuarioMB.usuario.estado}" rendered="#{usuarioMB.exibeEstados}"&gt;
            &lt;f:selectItems value="#{usuarioMB.estados}"/&gt;                            
        &lt;/h:selectOneMenu&gt;                        
    &lt;/a4j:outputPanel&gt;                  
&lt;/h:panelGroup&gt;

Esta funcionando perfeitamente (ou quase).
O único problema é quando o usuario faz o "submit" e dá erros de validações dos outros campos (que nao estão no codigo acima).
A variável "exibeEstados" fica null, entao só renderiza o <h:inputText .../> ao invés do <h:selectOneMenu .../>.
O método "showEstados" é onde ele verifica a existência de "estados" e seta o valor da variável "exibeEstados" (true/false)
Os outros campos estão também no mesmo Managed Bean (usuarioMB).

Acho que estou comentendo algum erro de conceito (ciclo de vida). Alguém pode me ajudar?

Desde já agradeço a ajuda

Clériston Martinelo

4 Respostas

falvesti

Você pode postar seu Managed Bean?

cleriston

sim.
Obs.: Por enquanto nao estou buscando os estados no banco, apenas verifico se o pais é 30 (Brasil) e adiciono 3 estados

package br.keko.mb;

import br.keko.modelo.Gmt;
import br.keko.modelo.Pais;
import br.keko.modelo.Usuario;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class UsuarioMB{
    private Usuario usuario;    
    private String mensagem = new String();
    private String senha;
    private String senhaconf;
    private Map paises = new HashMap();
    private Map gmt = new HashMap();
    private Map estados = new HashMap();
    private Boolean exibeEstados;
    
    public UsuarioMB()
    {
        System.out.println("Construtor-*********************");
        usuario = new Usuario();
        usuario.setPais(new Pais());                
        usuario.setGmt(new Gmt());            
    }

    public

    /** Creates a new instance of UsuarioMB */
    Usuario getUsuario() {        
        return usuario;
    }

    public void setUsuario(Usuario usuario) {        
        this.usuario = usuario;
    }
    
    public String salvar(){
        if (usuario.getLogin().equals("")) {            
            return "validar";
        }             
        else {
            EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("EstudoPU");
            EntityManager eManager = emFactory.createEntityManager();
            EntityTransaction tx = eManager.getTransaction();
            
            try{
                tx.begin();
                usuario.setId(0);
                eManager.persist(usuario);
                tx.commit();            
                return "sucesso";
            }catch(Exception e){
                if (tx.isActive()) tx.rollback();
                return "erro";

            }finally{
                eManager.close();
                emFactory.close();
            }
        }  
        
    }    
    
    public String getMensagem() {
        return mensagem;
    }

    public void setMensagem(String mensagem) {
        this.mensagem = mensagem;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getSenhaconf() {
        return senhaconf;
    }

    public void setSenhaconf(String senhaconf) {
        this.senhaconf = senhaconf;
    }

    public Map getPaises() {
        paises.clear();                
        EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("EstudoPU");        
        EntityManager eManager = emFactory.createEntityManager();        
        try {
            String selectPais = "select p from Pais p order by p.ingles";
            Query query = eManager.createQuery(selectPais);
            List&lt;Pais&gt; resultados = query.getResultList();
            for (Pais p : resultados){
                paises.put(p.getIngles(), p.getId());
            }            
        }
        finally {
            eManager.close();
            emFactory.close();            
        }        
        TreeMap tPaises = new TreeMap(paises);
        tPaises.put("", 0);
        return tPaises;
    }

    public void setPaises(Map paises) {
        this.paises = paises;
    }

    public Map getGmt() {
        gmt.clear();                
        EntityManagerFactory emFactory = Persistence.createEntityManagerFactory("EstudoPU");        
        EntityManager eManager = emFactory.createEntityManager();        
        try {
            String selectGmt = "select g from Gmt g";
            Query query = eManager.createQuery(selectGmt);
            List&lt;Gmt&gt; resultados = query.getResultList();
            
            for (Gmt g : resultados){                                
                String sGmt = Float.toString(g.getGmt()) ;
                gmt.put(sGmt, g.getId());
            }            
        }
        finally {
            eManager.close();
            emFactory.close();            
        }        
        TreeMap tGmt = new TreeMap(gmt);
        tGmt.put("", 0);
        return tGmt;
    }

    public void setGmt(Map gmt) {
        this.gmt = gmt;
    }

    public Map getEstados() {
        estados.put("São Paulo", 1);
        estados.put("Rio de Janeiro", 2);
        estados.put("Minas Gerais", 3);
        return estados;
    }
    
    public void showEstados(){
        System.out.println(usuario.getPais().getId());
        if ((usuario.getPais().getId() != null) &&
           (usuario.getPais().getId() == 30)){
            System.out.println("t");
            setExibeEstados((Boolean) true);
        }
        else {
            System.out.println("f");    
            setExibeEstados((Boolean) false);
        }            
    }

    public void setEstados(Map estados) {
        this.estados = estados;
    }

    public Boolean getExibeEstados() {
        return exibeEstados;
    }

    public void setExibeEstados(Boolean exibeEstados) {
        this.exibeEstados = exibeEstados;
    }

}
The_Toad

Olá cleriston, estou enfrentando o mesmo problema. Você conseguiu achar alguma solução?

Obrigado!
Raphael.

cleriston

Na realidade isso era apenas um estudo… q nao dei continuidade… tb nao fiquei sabendo :S

Criado 24 de abril de 2008
Ultima resposta 13 de jun. de 2008
Respostas 4
Participantes 3