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?
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.
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;
}