<h:SelectOneMenu> Erro de Conversão

Bom esse eh 1 erro q eh comum, mas as soluções dos outros nao está funcionando comigo…

Tipo Tenho um Usuario, e ele tem um atributo Colaborador…

Na Aplicação tem Um <h:SelectOneMenu>. Com os Dados do Colaborador. mas sem chance pra adicionar…

criei um Converter

public class ConverterColaborador implements Converter{

	public Object getAsObject(FacesContext context, UIComponent component, String value) {
		Colaborador c = new Colaborador();
		c.setNome(value);
		return c;
	}

	public String getAsString(FacesContext context, UIComponent component, Object classe) {
		Colaborador c = (Colaborador) classe;
		return c.getNome();
	}

}

Mas não Deu Certo, Sobreescrevi os Metodos Equals e hashCode. e Nd Tb…

Alguem tem alguma ideia de Como Arrumar isso, o erro eh

sourceId=j_id3:j_id9[severity=(ERROR 2), summary=(j_id3:j_id9: Validation Error: Value is not valid), detail=(j_id3:j_id9: Validation Error: Value is not valid)]

Alguem Pelo Amor de Deus :confused:

Esse erro ocorre quando o jsf compara o elemento selecionado no combo com os que estão na lista do combo e não encontra nenhum valor correspondente, portanto, o teste de igualadade desses objetos não está ocorrendo corretamente.

Todas as vezes que eu tive esse problema a causa tinha a ver com o método equals.
Verifique se ele está implementado corretamente.

Experimenta colocar um “break point” no métodos do seu conversor e vê se está tudo certo no seu conversor.
Caso naum seja erro do conversor posta o trecho do sua página.

Flw

bom a pagina ta aki…

<a4j:form id="formCad">
			
			Login: <br />
			<h:inputText value="#{mbUsuario.usuario.login}" /> <br /><br />
			
			Senha: <br />
			<h:inputSecret value="#{mbUsuario.usuario.senha}" required="true" /> <br /><br />
			
			TipoUsuario: <br />
			<h:selectOneMenu id="tipoUsuario" value="#{mbUsuario.usuario.tipoUsuario}" >
				<f:selectItems value="#{mbUsuario.listaTipoUsuario}"/>
				<f:converter converterId="ConverterTipoUsuario"/>
			</h:selectOneMenu> <br /> <br />
			
			Colaborador: <br />
			<h:selectOneMenu value="#{mbUsuario.usuario.colaborador}" >
				<f:selectItems value="#{mbUsuario.listaColaborador}"/>
				<f:converter converterId="ConverterColaborador"/>
			</h:selectOneMenu> <br />
		
		<br />
			
			<a4j:commandButton action="#{mbUsuario.salvarUsuario}"  image="/images/cadastrar.jpg" />
		</a4j:form>

QDo eu Criei Equals e Hashcode, foi pelo eclipse será q tem problema???

A melhor maneira é criar uma List (cada SelectItem você precisa informar um value e um id para ser usada na página), e criar um atributo para ler o id selecionado. A utilização de objetos (no caso Colaborador), não é permitida em qualquer h:select.

Consegui, foi sofrido consegui um jeito…

Obrigado quem m ajudo :smiley:

Ola.Como vcs conseguiram resolver o este problema?eu consigo gerar meu selectonemenu com os valores.Agora quando clico em salvar da este erro…Como arrumar?

ola, estou com um problema parecido e não sei o que fazer.

 <h:selectOneMenu id="servico" value="#{listarServicoMB.servicoSelecionado}">
 <f:selectItems value="#{listarServicoMB.servicos}"></f:selectItems>
 </h:selectOneMenu>

e o managed bean:

@ManagedBean(name = "listarServicoMB")
@SessionScoped
public class ListarServicosMB implements Serializable {

    private List<SelectItem> servicos;
    private SelectItem servicoSelecionado;

    public ListarServicosMB() {
        ServicoDAOJDBC s = new ServicoDAOJDBC();
        servicos = new ArrayList<SelectItem>();
        List<Servico> lista = s.findAll();
        for (Servico servico : lista) {
            servicos.add(new SelectItem(servico, servico.getNome()));
        }
    }

    public SelectItem getServicoSelecionado() {
        return servicoSelecionado;
    }

    public void setServicoSelecionado(SelectItem servicoSelecionado) {
        this.servicoSelecionado = servicoSelecionado;
    }

    public List<SelectItem> getServicos() {
        return servicos;
    }

    public void setServicos(List<SelectItem> servicos) {
        this.servicos = servicos;
    }
}

alguem tem alguma dica?

o erro que aparece é o seguinte:

“Erro de conversão ao definir o valor ‘Cirurgia cardíaca’ para ‘null Converter’.”

Alguém sabe o que está errado?

Consegui, estava esquecendo de associar meu Converter ao <h:SelectOneMenu>

Mano tu tem algo tipo manytoone ai em jsf ?

Não sei se aplicasse ao seu caso mas no meu corrigo o erro apos ver que estava referenciando o campo de forma errada no mapeamento.

o campo era refenciado como objeto ao inves de Integer.

@ManyToOne
@JoinColumn(name=“codProduto”)
private Produto produtos; --------- AQUI ESTAVA COMO NOME CODPRODUTO no qual retornava o valor de erro de conversão por causa da comparação do Hashcode

private Integer codProduto;

Mudei o nome da referencia e funcionou blz.

Espero que tenha ajudado.

Estou com o mesmo problema, gostaria de saber como resolveu…
Minhas entidades não tem anotação alguma.

aconselho usar lista de selectItem pois nela vc pode especificar o value e o label para sua combo !

um ex.:

public List colaboradores;

//getters and setter da lista

public List<SelectItem> getColaboradores() {
	if (colaboradores == null) {
		colaboradores = new ArrayList<SelectItem>();
	}
            List<Colaboradores> cola = //aqui aonde vc busca a lista;
            colaboradores.clear();
  
	for (int i = 0; i < cola.size(); i++) {
		Colaboradores c = cola.get(i);
                    colaboradores.add(new SelectItem(c.getId,c.getNome)); //aqui a lista de selectItem recebe um colaborador e respectivamente atribui o value e o label. la na tua tag do jsf  você chama a lista de selectItem
	}

	return colaboradores;
}

public void setColaboradores(List<SelectItem> colaboradores) {
	this.colaboradores = colaboradores;
}

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”.

Eu resolvi o meu problema colocando isso na linha do select.

required="true" requiredMessage=""