Eu fiz da seguinte forma
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;
}
Consegui resolver o problema do “null Converter”, mas surgiu uma exceção “Validation Error: Value is not valid”.Vi no blog do Rafael Ponte que a solução é implementar os métodos equals() e hashcode().Implementei, o código ta ai em cima, mas continuo com o problema.
Debugando eu vi que ele consegue acessar o converter, busca pelo objeto selecionado mas quando o jsf vai validar usando o método equals, o objeto que chega como parâmetro é um Integer e não o objeto selecionado no combo, daí na comparação dos tipos ele retorna “false”.