Versão atual:

Estou com dificuldade para usar selectOne e ajax do prime faces

Prezados,

Estou tentando criar dois selectOneMenu dentro de um formulário de endereço, um onde seleciona o estado e já atualiza o outro com as cidades deste estado. Tentei usar um exemplo do próprio site do Prime Faces http://www.primefaces.org/showcase/ui/pprSelect.jsf. Também estou usando Hibernate com uma infraestrutura MVC e DAO. Em uma página de testes que contem apenas a cidade salva certinho o resto dos campos de endereço. Mas quando uso estes dois selectOne juntos (um para estado e outro para cidade) não sei porque mas não salva quando tem uma cidade selecionada, e o pior é que não retorna nenhum erro. Quando o valor de cidade é null slava direito também. Eu tentei inserir uns println em locais estratégicos para tentar rastrear o problema mas parece que quando tem uma cidade selecionada o sistema não desenrola além do converter. O println do converter mostra os valores esperados para cidade e endereço mas não salva.

Segue o código da view testeend.xhtml:

Cadastro de Endereços (teste)

                <h:outputText value="Estado: " />
                <p:selectOneMenu id="drop_estado" value="#{endBean.estado}" effect="fade">  
                    <f:selectItem itemLabel="- selecione -" itemValue="" />
                       <f:selectItems value="#{endBean.estados}" var="estado" itemLabel="#{estado.sigla} - #{estado.nome}"/>  
                    <p:ajax update="drop_cidade" listener="#{endBean.handleEstadoChange}" />
                </p:selectOneMenu>

                <h:outputText value="Cidade: " />
                <p:selectOneMenu id="drop_cidade" value="#{endBean.end.idcidade}" effect="fade">  
                    <f:selectItem itemLabel="- selecione -" itemValue="" />
                       <f:selectItems value="#{endBean.cidadesPorEstado}" var="cidade" itemLabel="#{cidade.cnl} - #{cidade.nome}"/>  
                </p:selectOneMenu>

                   <h:outputLabel value="Endereço 1:"></h:outputLabel>  
                <p:inputText id="input_end1" value="#{endBean.end.endereco1}" />

                <h:outputLabel value="Endereço 2:"></h:outputLabel>  
                <p:inputText id="input_end2" value="#{endBean.end.endereco2}" />

                <h:outputLabel value="Complemento:"></h:outputLabel>  
                <p:inputText id="input_comp" value="#{endBean.end.complemento}" />

                <h:outputLabel id="input_cep" value="CEP:"></h:outputLabel>  
                <p:inputText value="#{endBean.end.cep}" />

              </p:panelGrid>
         </h:form>
         <f:facet name="footer"><p:commandButton value="Salvar" action="#{endBean.salvar}"
                         style="margin:1px 0" id="btnAdd" update="edicao,listagem"
                         icon="ui-icon-disk" />
         </f:facet>
      </p:panel>

Segue o código do Bean Cidade:


package packet.dao.cidade;

import java.io.Serializable; import java.util.Date; import java.util.HashSet; import java.util.Set; import javax.persistence.; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; import packet.dao.estado.;

@Entity @Table(name = "cidade") public class Cidade implements Serializable{

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name = "idcidade")
private Integer idcidade;

@ManyToOne
private Estado idestado;

@Column(name = "nomecidade")
private String nome;

@org.hibernate.annotations.NaturalId
@Column(name = "cnl")
private String cnl;


public Cidade() {
    super();
    // TODO Auto-generated constructor stub
}
public Cidade(Integer idcidade) {
    super();
    this.idcidade = idcidade;
}
public Cidade(Integer idcidade, Estado idestado, String nome, String cnl) {
    super();
    this.idcidade = idcidade;
    this.idestado = idestado;
    this.nome = nome;
    this.cnl = cnl;
}


public Integer getIdcidade() {
    return idcidade;
}
public void setIdcidade(Integer idcidade) {
    this.idcidade = idcidade;
}
public Estado getIdestado() {
    return idestado;
}
public void setIdestado(Estado idestado) {
    this.idestado = idestado;
}
public String getNome() {
    return nome;
}
public void setNome(String nome) {
    this.nome = nome;
}
public String getCnl() {
    return cnl;
}
public void setCnl(String cnl) {
    this.cnl = cnl;
}
@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((cnl == null) ? 0 : cnl.hashCode());
    result = prime * result
            + ((idcidade == null) ? 0 : idcidade.hashCode());
    result = prime * result
            + ((idestado == null) ? 0 : idestado.hashCode());
    result = prime * result + ((nome == null) ? 0 : nome.hashCode());
    return result;
}
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Cidade other = (Cidade) obj;
    if (cnl == null) {
        if (other.cnl != null)
            return false;
    } else if (!cnl.equals(other.cnl))
        return false;
    if (idcidade == null) {
        if (other.idcidade != null)
            return false;
    } else if (!idcidade.equals(other.idcidade))
        return false;
    if (idestado == null) {
        if (other.idestado != null)
            return false;
    } else if (!idestado.equals(other.idestado))
        return false;
    if (nome == null) {
        if (other.nome != null)
            return false;
    } else if (!nome.equals(other.nome))
        return false;
    return true;
}
@Override
public String toString() {
    return "Cidade [idcidade=" + idcidade + ", idestado=" + idestado
            + ", nome=" + nome + ", cnl=" + cnl + "]";
}

}


Segue o Bean End:


package packet.dao.end;

import java.io.Serializable; import java.util.Date; import java.util.HashSet; import java.util.Set; import javax.persistence.; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.ManyToOne; import packet.dao.cidade.;

@Entity @Table(name = "end") public class End implements Serializable{

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
@Column(name = "idend")
private Integer idend;

@ManyToOne
private Cidade idcidade;

@Column(name = "endereco1")
private String endereco1;

@Column(name = "endereco2")
private String endereco2;

@Column(name = "complemento")
private String complemento;

@Column(name = "cep")
private String cep;

public End() {
    super();
    // TODO Auto-generated constructor stub
}

public End(Integer idend) {
    super();
    this.idend = idend;
}

public End(Integer idend, Cidade idcidade, String endereco1,
        String endereco2, String complemento, String cep) {
    super();
    this.idend = idend;
    this.idcidade = idcidade;
    this.endereco1 = endereco1;
    this.endereco2 = endereco2;
    this.complemento = complemento;
    this.cep = cep;
}

public Integer getIdend() {
    return idend;
}

public void setIdend(Integer idend) {
    this.idend = idend;
}

public Cidade getIdcidade() {
    return idcidade;
}

public void setIdcidade(Cidade idcidade) {
    this.idcidade = idcidade;
}

public String getEndereco1() {
    return endereco1;
}

public void setEndereco1(String endereco1) {
    this.endereco1 = endereco1;
}

public String getEndereco2() {
    return endereco2;
}

public void setEndereco2(String endereco2) {
    this.endereco2 = endereco2;
}

public String getComplemento() {
    return complemento;
}

public void setComplemento(String complemento) {
    this.complemento = complemento;
}

public String getCep() {
    return cep;
}

public void setCep(String cep) {
    this.cep = cep;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((cep == null) ? 0 : cep.hashCode());
    result = prime * result
            + ((complemento == null) ? 0 : complemento.hashCode());
    result = prime * result
            + ((endereco1 == null) ? 0 : endereco1.hashCode());
    result = prime * result
            + ((endereco2 == null) ? 0 : endereco2.hashCode());
    result = prime * result
            + ((idcidade == null) ? 0 : idcidade.hashCode());
    result = prime * result + ((idend == null) ? 0 : idend.hashCode());
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    End other = (End) obj;
    if (cep == null) {
        if (other.cep != null)
            return false;
    } else if (!cep.equals(other.cep))
        return false;
    if (complemento == null) {
        if (other.complemento != null)
            return false;
    } else if (!complemento.equals(other.complemento))
        return false;
    if (endereco1 == null) {
        if (other.endereco1 != null)
            return false;
    } else if (!endereco1.equals(other.endereco1))
        return false;
    if (endereco2 == null) {
        if (other.endereco2 != null)
            return false;
    } else if (!endereco2.equals(other.endereco2))
        return false;
    if (idcidade == null) {
        if (other.idcidade != null)
            return false;
    } else if (!idcidade.equals(other.idcidade))
        return false;
    if (idend == null) {
        if (other.idend != null)
            return false;
    } else if (!idend.equals(other.idend))
        return false;
    return true;
}

@Override
public String toString() {
    return "End [idend=" + idend + ", idcidade=" + idcidade
            + ", endereco1=" + endereco1 + ", endereco2=" + endereco2
            + ", complemento=" + complemento + ", cep=" + cep + "]";
}

}


Segue o endBean:


package packet.web;

import java.util.List; import java.util.Set; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.RequestScoped; import javax.faces.context.FacesContext; import packet.dao.estado.; import packet.dao.cidade.; import packet.dao.end.*; import java.io.Serializable;

@ManagedBean(name = "endBean") @RequestScoped public class endBean implements Serializable{

private static final long serialVersionUID = 1L;
private End end = new End();
private String destinoSalvar;
private List<Cidade> cidades;
private List<Cidade> cidadesPorEstado;
private Cidade cidade = new Cidade();
private Estado estado = new Estado();
private List<Estado> estados;
private List<End> lista;


public List<Cidade> getCidadesPorEstado() {
    return cidadesPorEstado;
}

public void setCidadesPorEstado(List<Cidade> cidadesPorEstado) {
    this.cidadesPorEstado = cidadesPorEstado;
}

public Estado getEstado() {
    return estado;
}

public void setEstado(Estado estado) {
    this.estado = estado;
}

public Cidade getCidade() {
    return cidade;
}

public void setCidade(Cidade cidade) {
    this.cidade = cidade;
}

public End getEnd() {
    return this.end;
}

public void setEnd(End end) {
    this.end = end;
}

public String getDestinoSalvar() {
    return destinoSalvar;
}

public void setDestinoSalvar(String destinoSalvar) {
    this.destinoSalvar = destinoSalvar;
}

public List<Cidade> getCidades() {
    CidadeRN cidadeRN = new CidadeRN();
    this.setCidades(cidadeRN.lista());
    return this.cidades;
}

public void setCidades(List<Cidade> cidades) {
    this.cidades = cidades;
}

public List<Estado> getEstados() {
    EstadoRN estado = new EstadoRN();
    this.setEstados(estado.lista());
    return this.estados;
}

public void setEstados(List<Estado> estados) {
    this.estados = estados;
}

public List<End> getLista() {
    EndRN endRN = new EndRN();
    this.setLista(endRN.lista());
    return this.lista;
}

public void setLista(List<End> lista) {
    this.lista = lista;
}

public String novo(){
    this.setDestinoSalvar("/publico/novoend.jsf");
    this.setEnd(new End());
    return "/publico/testeend.jsf";
}

public String salvar(){
    System.out.println("salvar endBean" + this.end);
    EndRN endRN = new EndRN();
    endRN.salvar(this.end);        
    return "/publico/testeend.jsf";
}

public String salvar(End end, Cidade cidade){
    EndRN endRN = new EndRN();
    end.setIdcidade(cidade);
    this.end = end;
    endRN.salvar(this.end);        
    return "/publico/testeend.jsf";
}

public String excluir(End end){
    this.setDestinoSalvar("/publico/testeend.jsf");
    EndRN endRN = new EndRN();
    endRN.excluir(end);
    return this.destinoSalvar;
}

public List<End> buscarporcidade(Cidade c){
    EndRN end = new EndRN();
    this.setLista(end.buscarPorCidade(c.getCnl()));
    return this.getLista();
}

public void handleEstadoChange(){
    CidadeRN cidadeRN = new CidadeRN();
    if(!this.getEstado().equals(null)){  
        this.setCidadesPorEstado((List<Cidade>)cidadeRN.listaPorEstado(this.estado));  
    }else{  
        this.cidadesPorEstado = null;  
    }   
}

}

Segue o EndRN:


package packet.dao.end;

import packet.util.; import packet.dao.cidade.; import java.util.*;

public class EndRN {

private EndDAO end;
private Cidade cidade;

public EndRN(){
    this.end = DAOFactory.criarEndDAO();
}

public Cidade getCidade() {
    return cidade;
}

public void setCidade(Cidade cidade) {
    this.cidade = cidade;
}

public void salvar(End end){
    Integer idend = end.getIdend();
    System.out.println("EndRN -----------" + end + "EndRN" + idend);
    if(idend == null || idend == 0){
        this.end.salvar(end);
    } else {
        this.end.atualizar(end);
    }
}

public void atualizar(End end){
    this.end.atualizar(end);
}

public void excluir(End end){
    this.end.excluir(end);
}

public End carregar(Integer idend){
    return this.end.carregar(idend);
}

public List<End> lista(){
    return this.end.listar();
}
public List<End> buscarPorCidade(String cnl){
    return this.end.buscarPorCidade(cnl);
}

public List<End> buscarPorCEP(String cep){
    return this.end.buscarPorCEP(cep);
}

public List<End> buscarPorEnd(String end){
    return this.end.buscarPorEnd(end);
}

}

Versão(1):

Ver a versão formatada

Estou com dificuldade para usar selectOne e ajax do prime faces

Comentário

new question