[RESOLVIDO] Tags JSF + SelectOneMenu erro de conversão

Olá,

Já vi muitos tópicos referente a erro de conversão utilizando a tag <h:selectonemenu />, mesmo assim não estou conseguindo utilizar esta tag.
O problema que estou tendo é de conversão.
Tenho uma classe Grupo e uma classe Empresa. Dentro de empresa eu tenho a referencia de Grupo.
Coloquei a tag selectonemenu para selecionar os grupos do banco de dados e gravar dentro de empresa.
O problema está que sempre aparece erro de conversão, já tentei de várias formas fazer isto.
O que estou vendo é que independente de como eu busco os dados, o sistema está sempre pegando o valor do toString() do objeto.
Gostaria de entender melhor como isto funciona, mas não estou conseguindo.

Alguém pode me ajudar?
Já usei vários exemplos na web e nenhum deles funcionou.

<h:panelGroup>
	<h:selectOneMenu value="#{suaBean.objetoQueSeraSetadoAoSelecionarUmItem}">
	<f:selectItem itemValue="" itemLabel="Selecione..."/>
	<f:selectItems value="#{suaBean.suaLista}"
	var="nomeDeSuaListaParaSuaPage" itemValue="#{nomeDeSuaListaParaSuaPage.itemDaListaParaSerSetado}" itemLabel="#{nomeDeSuaListaParaSuaPage.valorQueIraApareceNaPage}"/>
	</h:selectOneMenu>
</h:panelGroup>

espero ter ajudado

ou para casos mas específicos que você tem uma lista de uma classe que tem vários objetos

<h:panelGroup>
	<h:selectOneMenu value="#{suaBean.objetoQueSeraSetadoAoSelecionarUmItem}">
	<f:selectItem itemValue="" itemLabel="Selecione..."/>
	<f:selectItems value="#{suaBean.suaLista}"
	var="nomeDeSuaListaParaSuaPage" itemValue="#{nomeDeSuaListaParaSuaPage.itemDaListaParaSerSetado}" itemLabel="#{nomeDeSuaListaParaSuaPage.valorQueIraApareceNaPage}"/>
	</h:selectOneMenu>
</h:panelGroup>

espero ter ajudado

Descobri que o problema era no meu conversor para String. Resolvi o problema do value ser o ID e não o toString do Grupo apenas acertando meu conversor:

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

Mas agora estou com outro problema.
Quando seleciono o grupo e clico em salvar, o sistema apresenta esta mensagem:
j_idt11:grupo: Validation Error: Value is not valid

Não apresenta erro no console, então tentei debugar e a única coisa que consegui descobrir é que a primeira vez que ele passa pelo conversor de Object ele passa corretamente, mas ele passa mais duas vezes depois com valor vazio e não sei por que ele faz isto.

Minha classe do conversor está assim:

@Override
	public Object getAsObject(FacesContext context, UIComponent component, String value) {
	    if (value == null || value.isEmpty()) {
		return null;
	}
		
	Long id = Long.valueOf(value);
		
	Grupo grupo = grupoService.getGrupo(id);
	
	return grupo;
}

Amigo pode postar seu xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
   xmlns:ui="http://java.sun.com/jsf/facelets"
   xmlns:f="http://java.sun.com/jsf/core"
   xmlns:h="http://java.sun.com/jsf/html"
   xmlns:c="http://java.sun.com/jsp/jstl/core"
   xmlns:rich="http://richfaces.org/rich"
   xmlns:a4j="http://richfaces.org/a4j"
   template="/WEB-INF/templates/default.xhtml">
   
   <f:metadata>
		<f:viewParam name="id" value="#{empresaController.id}"/>
		<f:event type="preRenderView" listener="#{empresaController.recupera}"/>
	</f:metadata>
	
	<ui:param name="pageTitle" value="Nova Empresa"/>

	<ui:define name="content">

		<h:form>
			<h:panelGrid columns="3" columnClasses="titleCell">
				<h:outputLabel for="id" value="Id:" rendered="#{not empty empresa.id}" />
				<h:inputText id="id" value="#{empresa.id}" rendered="#{not empty empresa.id}" disabled="true" />
				<h:message for="id" errorClass="invalid" rendered="#{not empty empresa.id}" />

				<h:outputLabel for="nome" value="Nome:" />
				<h:inputText id="nome" value="#{empresa.nome}" />
				<h:message for="nome" errorClass="invalid" />

				<h:outputLabel for="apelido" value="Apelido:" />
				<h:inputText id="apelido" value="#{empresa.apelido}" />
				<h:message for="apelido" errorClass="invalid" />

				<h:outputLabel for="email" value="E-Mail:" />
				<h:inputText id="email" value="#{empresa.email}" />
				<h:message for="email" errorClass="invalid" />

				<h:outputLabel for="cnpj" value="Cnpj:" />
				<h:inputText id="cnpj" value="#{empresa.cnpj}" />
				<h:message for="cnpj" errorClass="invalid" />

				<h:outputLabel for="telefone" value="Telefone:" />
				<h:inputText id="telefone" value="#{empresa.telefone}" />
				<h:message for="telefone" errorClass="invalid" />

				<h:outputLabel for="celular" value="Celular:" />
				<h:inputText id="celular" value="#{empresa.celular}" />
				<h:message for="celular" errorClass="invalid" />

				<h:outputLabel for="responsavel" value="Responsável:" />
				<h:inputText id="responsavel" value="#{empresa.responsavel}" />
				<h:message for="responsavel" errorClass="invalid" />

				<h:outputLabel for="site" value="Site:" />
				<h:inputText id="site" value="#{empresa.site}" />
				<h:message for="site" errorClass="invalid" />
				
				<h:outputLabel for="grupo" value="Grupo:" />
				<h:selectOneMenu id="grupo" value="#{empresa.grupo}" converter="#{empresaController.convertGrupo}">
					<f:selectItem itemLabel="" itemValue="" />
					<f:selectItems value="#{grupos}"  var="_grupo" itemLabel="#{_grupo}" itemValue="#{_grupo.id}" />
				</h:selectOneMenu>
				<h:message for="grupo" errorClass="invalid" />

				<h:outputLabel for="observacao" value="Observação:" />
				<h:inputTextarea id="observacao" value="#{empresa.observacao}" />
				<h:message for="observacao" errorClass="invalid" />

			</h:panelGrid>

			<p>
				<h:commandButton id="salvar" action="#{empresaController.salvar}" value="Salvar" styleClass="register" />
				<c:choose>
					<c:when test="#{!empty empresa.id}">
						<h:commandButton id="cancelar" action="view" value="Cancelar" styleClass="register" immediate="true">
							<f:param id="id" value="#{empresa.id}" />
						</h:commandButton>
					</c:when>
					<c:otherwise>
						<h:commandButton id="cancelar" action="list" value="Cancelar" styleClass="register" immediate="true" />
					</c:otherwise>
				</c:choose>
				<h:messages styleClass="messages" errorClass="invalid" infoClass="valid" warnClass="warning" globalOnly="true" />
			</p>
		</h:form>

	</ui:define>   

</ui:composition>

Eu descobri que o problema está na classe Grupo.
O valor que está sendo passado como objeto para o equals é o ID e não o objeto do grupo, então a comparação faz aparecer o erro.
Fiz uma alteração no grupo para comparar o ID do objeto com o objeto que está sendo enviado para o método da seguinte forma:


	@Override
	public boolean equals(Object obj) {
		if (this.id == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Grupo other = (Grupo) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}

Isto está correto?