avAtualizar um selectOneMenu por outro selectOneMenu

Java

15/07/2014

Boa noite. Possuo 2 selectOneMenu (Estados e Cidades), onde: - ao selecionar um determinado estado em um selectOneMenu, o sistema deverá filtrar o outro selectOneMenu mostrando apenas as cidades do estado selecionado.

O procedimento acima não esta funcionando, o selectOneMenu de cidades fica nulo e ao selecionar o estado apresenta o erro: Erro de conversão ao definir o valor 'br.com.softwareOptimus.entidades.Estado@22' para 'null Converter'. Erro de conversão ao definir o valor 'br.com.softwareOptimus.entidades.Estado@22' para 'null Converter'.

Existe as informações no banco de dados corretamente. Segue o meu bean:

package br.com.softwareOptimus.entidades.bens.geral;

import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import br.com.softwareOptimus.entidades.Estado;
import br.com.softwareOptimus.entidades.Municipio;
import br.com.softwareOptimus.entidades.RN.geral.EstadoRN;
import br.com.softwareOptimus.entidades.RN.geral.MunicipioRN;

@ManagedBean
@ViewScoped
public class GeralBean {

    private List<Estado> estados;
    private List<Municipio> municipios;
    private EstadoRN estadoRN = new EstadoRN();
    private MunicipioRN municipioRN = new MunicipioRN();
    private Estado uf = new Estado();

    public GeralBean(){
        setEstados(this.estadoRN.listaEstado());
    }


    public List<Estado> getEstados() {
        return estados;
    }

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


    public Estado getUf() {
        return uf;
    }


    public void setUf(Estado uf) {
        this.uf = uf;
    }

    public List<Municipio> getMunicipios() {
        return municipios;
    }

    public void setMunicipios(List<Municipio> municipios) {
        this.municipios = municipios;
    }

    public void filtraEstado(){
        this.municipios = municipioRN.listaMunicipios(uf);
    }


}



Segue o trecho do xhtml que executa o processo:
Estado:
<p:selectOneMenu id="uf" value="#{geralBean.uf}">
  <f:selectItems value="#{geralBean.estados}" var="listaEstados"
     itemLabel="#{listaEstados.descricao}" />
  <p:ajax update="municipios" event="change"
    listener="#{geralBean.filtraEstado}" />
</p:selectOneMenu>

Município:
<p:selectOneMenu id="municipios">
   <f:selectItem value="#{geralBean.municipios}"
      var="listaMun" itemLabel="#{listaMun.descricao}" />
</p:selectOneMenu>


Creio que seja algum erro bobo, mas não estou conseguindo encontra-lo. Se alguem encontrar desde já agradeço.

Segue as classes Estado e Municipio:

package br.com.softwareOptimus.entidades;

import java.io.Serializable;

import javax.persistence.Cacheable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name="tbMunicipio")
@Cacheable(true)
public class Municipio implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 7190834454652723153L;

    @Id
    @GeneratedValue
    private Long idMunicipio;

    private String descricao;

    private Integer codIbge;

    @ManyToOne
    private Estado uf;

    public Long getIdMunicipio() {
        return idMunicipio;
    }

    public void setIdMunicipio(Long idMunicipio) {
        this.idMunicipio = idMunicipio;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Integer getCodIbge() {
        return codIbge;
    }

    public void setCodIbge(Integer codIbge) {
        this.codIbge = codIbge;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result
                + ((idMunicipio == null) ? 0 : idMunicipio.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;
        Municipio other = (Municipio) obj;
        if (idMunicipio == null) {
            if (other.idMunicipio != null)
                return false;
        } else if (!idMunicipio.equals(other.idMunicipio))
            return false;
        return true;
    }



}

package br.com.softwareOptimus.entidades;

import java.io.Serializable;
import java.util.Collection;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import br.com.softwareOptimus.fiscal.GradeTributaria;


@Entity
@Table(name="tbEstado")
public class Estado implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = -652813449840837138L;

    @Id
    @GeneratedValue
    private Long idUf;

    private String descricao;

    private Integer codIbge;

    @ManyToOne
    private Pais pais;

    @OneToMany(mappedBy = "estado")
    private Collection<GradeTributaria> grades;

    @OneToMany(mappedBy = "uf")
    private Collection<Municipio> municipio;

    public Collection<Municipio> getMunicipio() {
        return municipio;
    }

    public void setMunicipio(Collection<Municipio> municipio) {
        this.municipio = municipio;
    }

    public Collection<GradeTributaria> getGrades() {
        return grades;
    }

    public void setGrades(Collection<GradeTributaria> grades) {
        this.grades = grades;
    }

    public Integer getCodIbge() {
        return codIbge;
    }

    public void setCodIbge(Integer codIbge) {
        this.codIbge = codIbge;
    }

    public Pais getPais() {
        return pais;
    }

    public void setPais(Pais pais) {
        this.pais = pais;
    }

    public Long getIdUf() {
        return idUf;
    }

    public void setIdUf(Long idUf) {
        this.idUf = idUf;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((idUf == null) ? 0 : idUf.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;
        Estado other = (Estado) obj;
        if (idUf == null) {
            if (other.idUf != null)
                return false;
        } else if (!idUf.equals(other.idUf))
            return false;
        return true;
    }

}

Fabricio Jacob

Fabricio Jacob

Curtidas 0

Respostas

Ronaldo Lanhellas

Ronaldo Lanhellas

15/07/2014

Você precisa criar uma classe Converter e adicioná-la no seu selectOneMenu, assim:

<p:selectOneMenu id="municipios" converter="myConverter">
   <f:selectItem value="#{geralBean.municipios}"
      var="listaMun" itemLabel="#{listaMun.descricao}" />
</p:selectOneMenu>


Essa classe será responsável por converter (como o próprio nome já diz) seu objeto para string e vice-versa.
GOSTEI 0
Sgrandini

Sgrandini

15/07/2014

Ronaldo,

Também estou a procura de uma solução para minha aplicação. Você tem algum exemplo de uma classe Converter genérica que possa mostrar?

Grata.
GOSTEI 0
POSTAR