Jsf conversao

5 respostas
T

Ola, amigos Corinthianos, Palmeirense, São Paulinos, Flamenguistas, Vascainos, Fluiminense..Gremistas e Colorados.....etc...

Estou estudando JSF e JPA e me deparei com uma grande dificuldade, eu estou tentando gravar o tipo da pessoa a partir de um comboBox, mas esta dificil, estou ficando maluco......e não consigo de jeito nenhum fazer esse cadastro funcionar esta dando o seguinte erro: "Validation Error: Value is not valid" eu fiz um converter personalizado...mas mesmo assim esta dando problema

Eu gostaria de saber...o que fazer..não consigo mas ver aonde esta o erro..abaixo vai o codigo

esse é o formulario de cadastro que tem o select one
<h:selectOneMenu id="tipoPessoa" value="#{pessoaView.tipoPessoa}" converter="converteInteiroTipoPessoa">
                        <f:selectItems value="#{pessoaView.buscarTodosTipo}" id="tipoDePessoa"/>
                    </h:selectOneMenu>
faces-config.xml
<converter>
        <converter-id>converteInteiroTipoPessoa</converter-id>
        <converter-class>
            br.com.addigital.util.converterInteiroObjeto
        </converter-class>
    </converter>
<managed-bean>
        <managed-bean-name>pessoaView</managed-bean-name>
        <managed-bean-class>br.com.addigital.controller.PessoaController</managed-bean-class>
        <managed-bean-scope>session</managed-bean-scope>                   
    </managed-bean>
meu bean de controle PessoaController.java
package br.com.addigital.controller;

import br.com.addigital.cotacao.Pessoa;
import br.com.addigital.cotacao.TipoPessoa;
import br.com.addigital.DAO.PessoaDAO;
import java.util.ArrayList;
import java.util.Iterator;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.faces.model.SelectItem;
import javax.faces.component.html.HtmlSelectOneMenu;
import java.util.List;

public class PessoaController {
    
    private Pessoa pessoa;
    
    private DataModel model;
    
    private String key;
    
    private TipoPessoa tipoPessoa;
    
        
    public PessoaController(){
        setKey("%");
    }
    
    public Pessoa getPessoa() {
        return pessoa;
    }

    public void setPessoa(Pessoa pessoa) {
        this.pessoa = pessoa;
    }
    
    public String novaPessoa(){
        this.setPessoa(new Pessoa());
        this.setTipoPessoa(new TipoPessoa());
        return "novo";
    }
    
    public DataModel getBuscaTodasPessoas(){
        PessoaDAO pessoaDAO=new PessoaDAO();
        setModel(new ListDataModel(pessoaDAO.listarTodasPessoas()));        
        return getModel();
    }
    
    public DataModel getBuscaNomePessoas(){
        PessoaDAO pessoaDAO=new PessoaDAO();
        setModel(new ListDataModel(pessoaDAO.listarNomePessoas(this.getKey())));
        return getModel();
    }

    public String getKey() {
        return key;
    }

    public void setKey(String key) {
        this.key = key;
    }
    
    public List <SelectItem> getBuscarTodosTipo(){
        
        //listaItem.add(new SelectItem(Integer.parseInt("15"),"COMPRADOR"));
        PessoaDAO pessoaDAO=new PessoaDAO();
        Iterator <TipoPessoa> lista=pessoaDAO.listarTipoPessoas().iterator();        
        List <SelectItem> listaItens=new ArrayList();
        TipoPessoa aux=null;
        while(lista.hasNext()){
            aux=lista.next();
            listaItens.add(new SelectItem(aux.getId(),aux.getTipo()));
        }        
        pessoaDAO=null;
        
        return listaItens;        
    }
    
    public String salvar(){
        PessoaDAO pessoaDAO=new PessoaDAO();
        //pessoa.getTipoPessoa().setId(tipoPessoa.getId());
        pessoaDAO.salvar(pessoa);
        pessoaDAO=null;
        pessoa=null;
        tipoPessoa=null;
        return "sucessoIns";
    }

    public DataModel getModel() {
        return model;
    }

    public void setModel(DataModel model) {
        this.model = model;
    }

    public TipoPessoa getTipoPessoa() {
        return tipoPessoa;
    }

    public void setTipoPessoa(TipoPessoa tipoPessoa) {
        this.tipoPessoa = tipoPessoa;
    }
    
    
    
    
}

Minha Conversao personalizada

package br.com.addigital.util;
import java.text.ParseException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import br.com.addigital.cotacao.Pessoa;
import br.com.addigital.cotacao.TipoPessoa;
import javax.faces.component.html.HtmlSelectOneMenu;

public class converterInteiroObjeto implements Converter {   
    
      
            
    public Object getAsObject(FacesContext context,UIComponent componente, String value) throws ConverterException {
        TipoPessoa tp=new TipoPessoa();
        tp.setId(Integer.getInteger(value));        
        return tp;
        
    }
    
    public String getAsString(FacesContext context, UIComponent component, Object target) {
        if (target!=null){           
           
           return String.valueOf(target);
        }
         return null;
    }
    
    
    
}
Meu bean de Pessoa.java
package br.com.addigital.cotacao;

import java.util.Collection;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

@Entity
@Table(name="PESSOA")
public class Pessoa implements java.io.Serializable {
    
    @Id
    @Column(name="ID_PESSOA",nullable=false)
    private Integer id;
    
    @Column(name="CNPJ_CPF")
    private String cpfCnpj;
   
    @Column(name="NOME")
    private String nome;
    
    @Column(name="EMAIL")
    private String email;
        
    @Column(name="LOGIN")
    private String login;
    
    @Column(name="SENHA")
    private String senha;
    
    @ManyToOne
    @JoinColumn(name="ID_TIPO")
    private TipoPessoa tipoPessoa;
    
    @OneToMany(cascade=CascadeType.ALL,mappedBy="pessoa")
    private Collection <Endereco> enderecos;
    
    public Pessoa(){
       tipoPessoa=new TipoPessoa();
       tipoPessoa.setId(0);
       tipoPessoa.setTipo("");
    }
        
    public Integer getId() {
        return id;
    }

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

    public String getNome() {
        return nome;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

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

    public TipoPessoa getTipoPessoa() {
        return tipoPessoa;
    }

    public void setTipoPessoa(TipoPessoa tipoPessoa) {
        this.tipoPessoa = tipoPessoa;
    }

    public Collection<Endereco> getEnderecos() {
        return enderecos;
    }

    public void setEnderecos(Collection<Endereco> enderecos) {
        this.enderecos = enderecos;
    }

    public String getCpfCnpj() {
        return cpfCnpj;
    }

    public void setCpfCnpj(String cpfCnpj) {
        this.cpfCnpj = cpfCnpj;
    }
        
}
TipoPessoa
package br.com.addigital.cotacao;

import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import br.com.addigital.cotacao.Pessoa;

@Entity
@Table(name="TIPOPESSOA")
public class TipoPessoa implements java.io.Serializable {

    @Id
    @Column(name="ID_TIPO",nullable=false)
    private Integer id;
    
    @Column(name="TIPO")
    private String tipo;
    
    @OneToMany(cascade=CascadeType.ALL,mappedBy="tipoPessoa")
    private List <Pessoa> pessoal;

    public Integer getId() {
        return id;
    }

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

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public List<Pessoa> getPessoal() {
        return pessoal;
    }

    public void setPessoal(List<Pessoa> pessoal) {
        this.pessoal = pessoal;
    }
    
       
        
}
PessoaDAO
package br.com.addigital.DAO;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import br.com.addigital.cotacao.TipoPessoa;
import br.com.addigital.cotacao.Pessoa;


public class PessoaDAO {
    
    private EntityManagerFactory emf;
    
    private EntityManager getEntityManager(){
        return emf.createEntityManager();
    }
    
    public PessoaDAO() {
       emf=Persistence.createEntityManagerFactory("CotacaoPU");       
    }
    
    public void salvar(Pessoa pessoa){
        EntityManager em=getEntityManager();
        try{
            em.getTransaction().begin();
            em.persist(pessoa);
            em.getTransaction().commit();            
        }catch(Exception e){
            em.getTransaction().rollback();
            e.printStackTrace();
        }finally{
            em.close();
        }
    }
    
    public void atualizar(Pessoa pessoa){
        EntityManager em=getEntityManager();
        try{
            em.getTransaction().begin();
            em.merge(pessoa);
            em.getTransaction().commit();            
        }catch(Exception e){
            em.getTransaction().rollback();
            e.printStackTrace();
        }finally{
            em.close();
        }
    }
    
    public void excluir(Pessoa pessoa){
        EntityManager em=getEntityManager();
        try{
            em.getTransaction().begin();
            pessoa=em.merge(pessoa);
            em.remove(pessoa);
            em.getTransaction().commit();            
        }catch(Exception e){
            em.getTransaction().rollback();
            e.printStackTrace();
        }finally{
            em.close();
        }
    }
    
    public <Pessoa> List listarTodasPessoas(){
        EntityManager em=getEntityManager();
        try{
            Query q=em.createQuery("select p from Pessoa p");            
            return q.getResultList();
        }finally {
            em.close();
        }
    }
    
    public <Pessoa> List listarNomePessoas(String nomeDaPessoa){
        EntityManager em=getEntityManager();
        try{
            Query q=em.createQuery("select p from Pessoa p where p.nome LIKE ?1");
            
            q.setParameter(1,nomeDaPessoa);
            
            return q.getResultList();
            
        }finally {
            em.close();
        }
    }
    
    public List listarTipoPessoas(){
        EntityManager em=getEntityManager();
        try{
            Query q=em.createQuery("select p from TipoPessoa p");
                       
            return q.getResultList();
            
        }finally {
            em.close();
        }
    }
    
    
    
}

eu agradeço se alguem me dar uma "Luz..."

5 Respostas

andre_udi

Olá amigo,

estava tendo este mesmo problema em algumas execuções.
Como estava utilizando o JBoss SEAM no projeto,
utilizei a tag s:convertEntity:

<h:selectOneMenu id="tipoPessoa" value="#{pessoaView.tipoPessoa}" >  
              <f:selectItems value="#{pessoaView.buscarTodosTipo}" id="tipoDePessoa"/>  
              <s:convertEntity/>
       </h:selectOneMenu>

Ela converte os tipos automaticamente, sem a necessidade de convertes.

[]'s

D
public Object getAsObject(FacesContext facesContext, UIComponent uIComponent, String value) throws ConverterException {
        
        try {
            if(Integer.parseInt(string)>0)
                 // value deve ser o id do tipoPessoa
                //  se no seu factory não tem um método que busca no bd o objeto tipoPessoa utilizando se id, implemente-o
                //  return SeuFactory.getTipoPessoa(Integer.parseInt(value)); -> carrega TipoPessoa do bd utilizando o id
            else
                return null;
        } catch (Exception ex) {
            return null;
        }
        
    }
    
    public String getAsString(FacesContext facesContext, UIComponent uIComponent, Object target) throws ConverterException { 
        if (target!= null && object instanceof TipoPessoa ) {
            return Integer.toString(((TipoPessoa ) target).getId());
        } else
            return null;
        
    }

Espero que dê certo. Eu faço dessa forma e sempre dá certo :) ...
Abraços

T

Obrigado…a dica de vcs foi muito legal !!! consegui resolver o meu problema…não estou com o codigo em mãos
mas amanhã quando estarei no meu serviço e posto para o resto da Galera “CONRINTHIANA E SOFREDORA EM JSF”

igorbrites

oi tspdigital, ei sei q o topico é mto antigo, mas vc ainda tem o codigo da solução?

espero sua resposta. Vlw!!!

vitenho

http://www.rponte.com.br/2008/02/01/selectonemenu-converter-erro-de-validacao/

Criado 28 de novembro de 2007
Ultima resposta 10 de ago. de 2009
Respostas 5
Participantes 5