Jsf conversao

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

[code]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;
}

}[/code]

Minha Conversao personalizada

[code]
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;
}

}[/code]

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;
    }
        
}[/code]


TipoPessoa
[code]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;
    }
    
       
        
}[/code]

PessoaDAO
[code]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…”

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

[code] 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;
    
}[/code]

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

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”

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

espero sua resposta. Vlw!!!

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