1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

OneselectMenu - PrimeFaces

Olá, estou fazendo dois oneSelectMenu em um formulário atráves de uma consulto a Entitys. Ele traz as informções tudo ok, mas quando tento dar submite no formulário ele marca os menu em vermelho e não chama o método. Estou a algum tempo procurando o problema mas não encontro, e o pior é que como ele não chama método nenhum não consigo depurar.

Fica assim: http://prntscr.com/3ovhkr

meu xhtml:

                    <p:selectOneMenu id="estado" label="estado" value="#{clienteControl.cliente.estado}" converter="#{entityConverter}">
                        <f:selectItem itemLabel="Selecione um estado" itemValue="" />
                        <f:selectItems var="e" value="#{clienteControl.estados}" itemLabel="#{e.descricao}" itemValue="#{e}" />                
                    </p:selectOneMenu>


                    <h:outputLabel for="cidade" value="Cidade: " /> 

                    <p:selectOneMenu id="cidade" label="cidade" value="#{clienteControl.cliente.cidade}" converter="#{entityConverter}">
                        <f:selectItem itemLabel="Selecione uma cidade" itemValue="" />
                        <f:selectItems var="c" value="#{clienteControl.cidades}" itemLabel="#{c.descricao}" itemValue="#{c}" />
                    </p:selectOneMenu>

Meu bean:

    public List<Estado> getEstados() {
        return clienteService.buscarListaEstado();
    }

    public List<Cidade> getCidades() {
        return clienteService.buscarListaCidade();
    }

Minha classe de banco:

    @SuppressWarnings("unchecked")
    public List<Estado> buscarListaEstado() {
        try {
            Query query = em.createQuery("select e from Estado e");
            List<Estado> estados = query.getResultList();
            return estados;
        } catch(Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public List<Cidade> buscarListaCidade() {
        try {
            Query query = em.createQuery("select c from Cidade c");
            List<Cidade> cidades = query.getResultList();
            return cidades;
        } catch (Exception e) {
            e.printStackTrace();
            return null;        
        }
    }

Meu converter:

package converter;

import java.lang.reflect.Method;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.el.ValueExpression;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceContextType;

@FacesConverter(value = "entityConverter")
public class EntityConverter implements Converter {

    private EntityManagerFactory emf = Persistence.createEntityManagerFactory("Aldo_Trabalho2_N2");
    private EntityManager em = emf.createEntityManager();

    @SuppressWarnings("unchecked")
    @Override
    public Object getAsObject(FacesContext facesContext,
            UIComponent uiComponent, String value) {
        if (value == null || value.isEmpty()) {
            return null;
        }
        Object object = uiComponent.getAttributes().get(value);

        if (object == null) {
            ValueExpression valueExpression = uiComponent
                    .getValueExpression("value");
            @SuppressWarnings("rawtypes")
            Class entityClass = valueExpression.getType(facesContext
                    .getELContext());

            try {
                object = em.find(entityClass, Long.parseLong(value));
            } catch (Exception e) {
                try {
                    object = em.find(entityClass, Integer.parseInt(value));
                } catch (Exception e1) {

                }

            }
        }
        return object;
    }

    public String getAsString(FacesContext facesContext,
            UIComponent uiComponent, Object value) {

        String id = null;

        if (value == null) {
            return null;
        }

        if (value instanceof String) {
            if (((String) value).isEmpty()) {
                return null;
            } else {
                id = (String) value;
                uiComponent.getAttributes().put(id, value);
                return id;
            }
        }

        if (value instanceof Integer) {
            id = Integer.toString((Integer) value);
            uiComponent.getAttributes().put(id, value);
            return id;

        }

        if (value instanceof Long) {
            id = Long.toString((Long) value);
            uiComponent.getAttributes().put(id, value);
            return id;

        }

        try {
            Method method = value.getClass().getMethod("getId");
            Object obj = method.invoke(value, new Object[] {});
            if (obj != null) {
                id = obj.toString();
                uiComponent.getAttributes().put(id, value);
            }

        } catch (java.lang.NoSuchMethodException e) {
            System.out
                    .println("Método getId não implementado na classe vinculada ao Componente :"
                            + uiComponent.getId());

        } catch (Exception ex) {
            Logger.getLogger(EntityConverter.class.getName()).log(Level.SEVERE,
                    null, ex);
        }
        return id;
    }

}

entity Estado

package entity;

import java.io.Serializable;

import javax.persistence.*;

import java.util.List;


/**
 * The persistent class for the estado database table.
 * 
 */
@Entity
@NamedQuery(name="Estado.findAll", query="SELECT e FROM Estado e")
public class Estado implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private Integer id;

    private String descricao;

    //bi-directional many-to-one association to Cidade
    @OneToMany(mappedBy="estadoBean")
    private List<Cidade> cidades;

    //bi-directional many-to-one association to Cliente
    @OneToMany(mappedBy="estado")
    private List<Cliente> clientes;

    public Estado() {
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDescricao() {
        return this.descricao;
    }

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

    public List<Cidade> getCidades() {
        return this.cidades;
    }

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

    public Cidade addCidade(Cidade cidade) {
        getCidades().add(cidade);
        cidade.setEstadoBean(this);

        return cidade;
    }

    public Cidade removeCidade(Cidade cidade) {
        getCidades().remove(cidade);
        cidade.setEstadoBean(null);

        return cidade;
    }

    public List<Cliente> getClientes() {
        return this.clientes;
    }

    public void setClientes(List<Cliente> clientes) {
        this.clientes = clientes;
    }

    public Cliente addCliente(Cliente cliente) {
        getClientes().add(cliente);
        cliente.setEstado(this);

        return cliente;
    }

    public Cliente removeCliente(Cliente cliente) {
        getClientes().remove(cliente);
        cliente.setEstado(null);

        return cliente;
    }

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



}

entity Cidade:

package entity;

import java.io.Serializable;

import javax.persistence.*;

import java.util.ArrayList;
import java.util.List;


/**
 * The persistent class for the cidade database table.
 * 
 */
@Entity
@NamedQuery(name="Cidade.findAll", query="SELECT c FROM Cidade c")
public class Cidade implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer id;

    private String descricao;

    //bi-directional many-to-one association to Estado
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="estado")
    private Estado estadoBean;

    //bi-directional many-to-one association to Cliente
    @OneToMany(mappedBy="cidade", fetch = FetchType.EAGER)
    private List<Cliente> clientes;


    public Cidade() {
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getDescricao() {
        return this.descricao;
    }

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

    public Estado getEstadoBean() {
        return this.estadoBean;
    }

    public void setEstadoBean(Estado estadoBean) {
        this.estadoBean = estadoBean;
    }

    public List<Cliente> getClientes() {
        return this.clientes;
    }

    public void setClientes(List<Cliente> clientes) {
        this.clientes = clientes;
    }

    public Cliente addCliente(Cliente cliente) {
        getClientes().add(cliente);
        cliente.setCidade(this);

        return cliente;
    }

    public Cliente removeCliente(Cliente cliente) {
        getClientes().remove(cliente);
        cliente.setCidade(null);

        return cliente;
    }

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



}

entity Cliente:

package entity;

import java.io.Serializable;

import javax.persistence.*;


/**
 * The persistent class for the cliente database table.
 * 
 */
@Entity
@NamedQuery(name="Cliente.findAll", query="SELECT c FROM Cliente c")
public class Cliente implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    private Integer id;

    private String bairro;

    private String cep;

    private String cpfcnpj;

    private Integer ddd1;

    private Integer ddd2;

    private String endereco;

    private String nome;

    private String tel1;

    private String tel2;

    //bi-directional many-to-one association to Cidade
    @ManyToOne()
    @JoinColumn(name="cidadeid")
    private Cidade cidade;

    //bi-directional many-to-one association to Estado
    @ManyToOne()
    @JoinColumn(name="estadoid")
    private Estado estado;    


    public Cliente() {
    }

    public Integer getId() {
        return this.id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getBairro() {
        return this.bairro;
    }

    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public String getCep() {
        return this.cep;
    }

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

    public String getCpfcnpj() {
        return this.cpfcnpj;
    }

    public void setCpfcnpj(String cpfcnpj) {
        this.cpfcnpj = cpfcnpj;
    }

    public Integer getDdd1() {
        return this.ddd1;
    }

    public void setDdd1(Integer ddd1) {
        this.ddd1 = ddd1;
    }

    public Integer getDdd2() {
        return this.ddd2;
    }

    public void setDdd2(Integer ddd2) {
        this.ddd2 = ddd2;
    }

    public String getEndereco() {
        return this.endereco;
    }

    public void setEndereco(String endereco) {
        this.endereco = endereco;
    }

    public String getNome() {
        return this.nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getTel1() {
        return this.tel1;
    }

    public void setTel1(String tel1) {
        this.tel1 = tel1;
    }

    public String getTel2() {
        return this.tel2;
    }

    public void setTel2(String tel2) {
        this.tel2 = tel2;
    }

    public Cidade getCidade() {
        return this.cidade;
    }

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

    public Estado getEstado() {
        return this.estado;
    }

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

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



}

Obrigado pela atenção

  • Debuga o Converter, esse possívelmente se trata de um erro no ciclo de vida de validação, ao não conseguir validar alguma informação ou no seu caso realizar a conversão, a fase posterior não é chamada mesmo.

    Tiago Vieira Dos Santos   02 de jun de 2014
  • Além do que o Tiago falou, verifique se não ocorre nenhum erro no console do browser (javascript).

    Lucas Heitich   02 de jun de 2014
  • Ele não apresenta nenhum erro javascript. E Tiago, eu não consigo debugar o entityConverter, ele não está entrando no entityConverter, mesmo colocando os breackpoint ele não entra e também não apresenta nenhum erro na stacktrace

    Joao Paulo   02 de jun de 2014
  • Realiza um teste removendo ou definindo um valor no itemValue do selectItem, postei um exemplo abaixo

    Tiago Vieira Dos Santos   02 de jun de 2014
  • Eu estava dando uma olhada e existe a possibilidade do converter estar falhando na hora do metodo getAsObject porque ele não converte para o Integer e sim para o int? Porque até onde eu sei os dois tem diferenças, na minha entity os Ids estão declarados como Integer mas no converter eu pego o a string pra int com o Integer.parseInt(). Será que o problema está aí?? Estou tentando achar uma solução pra isso mas queria ter certeza que o problema é esse.

    Joao Paulo   02 de jun de 2014
Mostrar todos os 6 comentários>
  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

3 respostas

Não é a resposta que estava procurando? Procure outras perguntas com as tags primefaces jpa entity-framework arraylist ou faça a sua própria pergunta.