Problema Com SelectOneMenu

Bom galera estou com um problema com SelectOneMenu, pesquisando eu vi mta gente já teve esse problema “null Converter” e “validation error:value is not valid”.

Implementei o converter e dentro do método getAsObject faço uma consulta pelo value(que é o id do objeto selecionado) que recebo como parametro.Assim o erro “null Converter” é resolvido, mas um erro de validação acontece.

Pelo que li esse erro acontece durando a fase de validação no ciclo de vida do JSF onde ele compara o objeto usando os métodos Equals e o Hashcode.Ambos métodos estão implementados e debugando vi que o objeto que chega no método Equals é um inteiro com o id do objeto, e não o próprio objeto.Sendo assim o método acaba retornando false quando comparo a classe do objeto recebido com a classe da entidade que esta nos itens do SelectOneMenu.

Alguem tem uma solução para isso ou poderia dizer onde posso estar errando?

Dá uma olhada nesses links que vc resolve o problema:
http://www.rponte.com.br/2008/02/01/selectonemenu-converter-erro-de-validacao/
http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/

Eu segui esses dois posts do Rafael Ponte, consegui resolver o primeiro problema com eles.Mas o problema da valiação que a solução é simplesmente implementar os métodos hashcode e o equals continuam.

Posta o código.

Na view

<h:outputLabel value="Curso*" /> <h:selectOneMenu id="selectCurso" value="#{ParticipanteBean.sel_curso}" > <f:converter converterId="cursoConverter"/> <f:selectItem itemValue="" itemLabel="Selecione..." /> <f:selectItems value="#{ParticipanteBean.listaCurso}" var="c" itemLabel="#{c.description}" itemValue="#{c.value}"/> </h:selectOneMenu>

O Converter

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package nst.controlenst.converter;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import nst.controlenst.enums.EnumDAO;
import nst.controlenst.enums.EnumTypeFactory;
import nst.controlenst.model.entity.Curso;
import nst.controlenst.persistence.dao.factory.interfaces.CursoDAO;
import nst.controlenst.persistence.dao.util.FabricaDAO;

/**
 *
 * @author emidio
 */
@FacesConverter(value="cursoConverter")
public class CursoConverter implements Converter{
    CursoDAO cursoDao;
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        Curso c = new Curso();
        try {
            this.cursoDao = (CursoDAO)FabricaDAO.getFactoryType(EnumTypeFactory.JDBC).getDAO(EnumDAO.CURSODAO);
            System.out.println("Curso::::::::::::::::::"+value);
            c = this.cursoDao.getByPrimaryKey(Integer.parseInt(value));
        } catch (Exception ex) {
            Logger.getLogger(ProjetoConverter.class.getName()).log(Level.SEVERE, null, ex);
        }
            return c;
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
            return value.toString();
    }
}

Método equals e hashcode da classe curso

@Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Curso other = (Curso) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if ((this.descricao == null) ? (other.descricao != null) : !this.descricao.equals(other.descricao)) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 97 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 97 * hash + (this.descricao != null ? this.descricao.hashCode() : 0);
        return hash;
    }

No meu bean

public ArrayList<SelectItem> getListaCurso() { List<Object> cursos; try { cursos = cursoBO.listar(); for(Object curso : cursos){ Curso c = (Curso) curso; this.listaCurso.add(new SelectItem(c.getId() , c.getDescricao())); } } catch (BusinessExceptions ex) { Logger.getLogger(ParticipanteBEAN.class.getName()).log(Level.SEVERE, null, ex); } return listaCurso; }

Alguém mais?