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?