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

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

[code]
<h:outputLabel value="#{msg.pais}" for=“pais”/>
<h:selectOneMenu id=“pais” value="#{usuarioMB.usuario.pais.id}" immediate=“true”>
<f:selectItems value="#{usuarioMB.paises}"/>
<a4j:support event=“onblur” ajaxSingle=“true” action="#{usuarioMB.showEstados}" reRender=“status,status1,panel1,panel2”/>
</h:selectOneMenu>

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

                    [/code]

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

Você pode postar seu Managed Bean?

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

}

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

Obrigado!
Raphael.

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