selectOneMenu selecionado com valor do bean
28/11/2011
0
Abaixo segue o xhtml
<?xml version=1.0 encoding=ISO-8859-1?> <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd> <html xmlns=http://www.w3.org/1999/xhtml xmlns:ui=http://java.sun.com/jsf/facelets xmlns:h=http://java.sun.com/jsf/html xmlns:f=http://java.sun.com/jsf/core xmlns:p=http://primefaces.prime.com.tr/ui> <h:body> <ui:insert name=boxTopo> <ui:include src=../../comum/estrutura/topo.xhtml /> </ui:insert> <div class=boxCorpo> <div class=corpo> <ui:insert name=boxMenu> <ui:include src=../../comum/estrutura/menu.xhtml /> </ui:insert> <div class=boxAbas> <h:outputLink styleClass=btAbaPesquisar title=Pesquisar>Pesquisar</h:outputLink> <h:outputLink styleClass=btAbaCadastrar title=Cadastrar>Cadastrar</h:outputLink> </div> <div class=topoLista>Cadastro de Unidade</div> <div class=boxConteudo> <h:form id=Cadastro> <div class=boxCamposFormulario> <h:inputHidden value=#{UnidadeCadastroBean.unidade.unidadeID} /> <p:outputPanel styleClass=boxW300 id=boxCliente> <h:outputLabel value=Cliente for=Cliente title=Cliente styleClass=obrigatorio w300 lblDescCampo /> <h:selectOneMenu id=Cliente value=#{UnidadeCadastroBean.unidade.cliente} required=true converter=ClienteConverter requiredMessage=#{MensagemBean.mensagemFormulario} styleClass=w300 select> <f:selectItem itemLabel=#{MensagemBean.textoSelecione} itemValue= noSelectionOption=true/> <f:selectItems value=#{ProjetoBean.listaCliente} var=cliente itemLabel=#{cliente.nome} itemValue=# /> </h:selectOneMenu> </p:outputPanel> <div class=separador > </div> <p:outputPanel styleClass=boxW400 id=boxNome> <h:outputLabel value=Nome title=Nome for=nome styleClass=obrigatorio w400 lblDescCampo /> <p:inputText id=Nome label=Nome value=#{UnidadeCadastroBean.unidade.nome} maxlength=100 required=true requiredMessage=#{MensagemBean.mensagemFormulario} styleClass=w400 /> </p:outputPanel> <div class=separador > </div> <p:outputPanel styleClass=boxW225 id=boxStatus> <h:outputLabel value=Status for=Status title=Status styleClass=obrigatorio w225 lblDescCampo /> <h:selectOneMenu id=Status value=#{UnidadeCadastroBean.unidade.status} title=Status styleClass=select w225 required=true requiredMessage=#{MensagemBean.mensagemFormulario}> <f:selectItem itemLabel=#{MensagemBean.textoSelecione} itemValue= /> <f:selectItems value=#{ProjetoBean.status}/> </h:selectOneMenu> </p:outputPanel> <p:outputPanel styleClass=boxTextAreaGrande id=boxObs> <h:outputLabel value=Obs for=Obs title=Obs styleClass=lblDescCampo /> <p:inputTextarea id=Obs effectDuration=400 value=#{UnidadeCadastroBean.unidade.obs} styleClass=textAreaGrande/> </p:outputPanel> </div> <p:commandButton id=btCadastrar action=#{UnidadeCadastroBean.Salvar} value=Cadastrar styleClass=btCadastrar update=boxMensagemValidacao ajax=false/> </h:form> <p:messages id=boxMensagemValidacao /> </div> </div> </div> </h:body> </html>
Eu debuguei o bean e o valor está correto, já sobreescrevi os hashCode e o equals mas também não funcionou, tambem debuguei o converter e está correto
Para ter certeza de que o cliente selecionado para edição estava correto, coloquei esse componente na tela, apenas para teste e ele imprime correto
<h:outputLabel value=#{UnidadeCadastroBean.unidade.cliente.clienteID}/>
Será que pode ser algo com o scoped do bean ?
Abaixo segue o bean
@ManagedBean(name=UnidadeCadastroBean) @RequestScoped public class UnidadeCadastroBean { private Unidade unidade = new Unidade(); public String Salvar(){ UnidadeRN unidadeRN = new UnidadeRN(); Integer unidadeId = this.unidade.getUnidadeID(); try { unidadeRN.Salvar(this.unidade); FacesContext context = FacesContext.getCurrentInstance(); if(unidadeId == null){ FacesMessage msg = new FacesMessage(GlossarioTexto.getInstance().getSucesso(),GlossarioMensagens.getInstance().getMSG01()); context.addMessage(gwlMansagem, msg); }else{ FacesMessage msg = new FacesMessage(GlossarioTexto.getInstance().getSucesso(),GlossarioMensagens.getInstance().getMSG02()); context.addMessage(gwlMansagem, msg); } } catch (RNException rn) { FacesContext context = FacesContext.getCurrentInstance(); FacesMessage msg = new FacesMessage(rn.getMessage()); context.addMessage(null, msg); return /gerenciador/content/unidade/unidadeCadastro; } return /gerenciador/content/unidade/index; } public String AlteraStatus() { if(this.unidade.getStatus()){ this.unidade.setStatus(false); }else{ this.unidade.setStatus(true); } UnidadeRN unidadeRN = new UnidadeRN(); try { unidadeRN.Salvar(this.unidade); } catch (RNException rn) { FacesContext context = FacesContext.getCurrentInstance(); FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_WARN,rn.getMessage(),null); context.addMessage(null, msg); return /gerenciador/content/unidade/unidadeListagem; } return null; } public String Editar(){ return /gerenciador/content/unidade/unidadeCadastro; } public Unidade getUnidade() { return unidade; } public void setUnidade(Unidade unidade) { this.unidade = unidade; } }
Att
Daniel Everling
Posts
28/11/2011
Davi Costa
provavelmente o bean que traz os itens está null:
<p:outputPanel styleClass=boxW225 id=boxStatus>
<h:outputLabel value=Status for=Status title=Status styleClass=obrigatorio w225 lblDescCampo />
<h:selectOneMenu id=Status value=#{UnidadeCadastroBean.unidade.status} title=Status styleClass=select w225 required=true requiredMessage=#{MensagemBean.mensagemFormulario}>
<f:selectItem itemLabel=#{MensagemBean.textoSelecione} itemValue= />
<f:selectItems value=#{ProjetoBean.status}/>
</h:selectOneMenu>
</p:outputPanel>
Pegue o getter do status que fica no ProjetoBean e coloque tb no bean UnidadeCadastroBean
att Davi
28/11/2011
Daniel Everling
<p:outputPanel styleClass=boxW300 id=boxCliente> <h:outputLabel value=Cliente for=Cliente title=Cliente styleClass=obrigatorio w300 lblDescCampo /> <h:selectOneMenu id=Cliente value=#{UnidadeCadastroBean.unidade.cliente} required=true converter=ClienteConverter requiredMessage=#{MensagemBean.mensagemFormulario} styleClass=w300 select> <f:selectItem itemLabel=#{MensagemBean.textoSelecione} itemValue= noSelectionOption=true/> <f:selectItems value=#{ProjetoBean.listaCliente} var=cliente itemLabel=#{cliente.nome} itemValue=# /> </h:selectOneMenu> </p:outputPanel>
o de status como colocaste está ok.
28/11/2011
Daniel Everling
Abaixo segue o converter para conferencia, mas fiz um debug nele e retorna certo.
public class ClienteConverter implements Converter{ @Override public Object getAsObject(FacesContext context, UIComponent component, String value) { if ( (value != null) && (value.trim().length() > 0) && (!value.equals(GlossarioTexto.getInstance().getSelecione())) ) { Integer clienteID = Integer.valueOf(value); try { ClienteRN clienteRN = new ClienteRN(); Cliente cliente = new Cliente(); cliente.setClienteID(clienteID); return clienteRN.Obter(cliente); } catch (Exception e) { throw new ConverterException(Erro ao efetuar a conversão da classe cliente + value + . + e.getMessage()); } } return null; } @Override public String getAsString(FacesContext context, UIComponent component, Object value) { if( (value != null) && (!value.equals()) ){ if (value instanceof Cliente) { Cliente cliente = (Cliente) value; return cliente.getClienteID().toString(); }else{ ClienteRN clienteRN = new ClienteRN(); Cliente cliente = new Cliente(); cliente.setClienteID(Integer.parseInt(value.toString())); cliente = clienteRN.Obter(cliente); return cliente.getClienteID().toString(); } } return null; } }
já sobreescrevi o hashCode e o equals das classes unidada e cliente mas não funcionou.
O que mais poderia ser ???
28/11/2011
Daniel Everling
Mas seguinte, comecei a escovar o programa, passo a passo para ver o que faz.
E achei estranho uma coisa, na listagem da unidade, ao inves de imprimir o nome do cliente imprimi o objeto e o que foi impresso foi algo assim
<b>classe.projeto.cliente.Cliente@d2804c0d</b>
seguindo essa logica, efetuei a impressao do que chegava no converter, para saber se ele realmente estava certo, mas ai que achei estranho, o que chegou no converter foi isso
<b>classe.projeto.cliente.Cliente@72e8e69</b>
Parece que a tela de listagem envia outro objeto pro conversor, o que vc acha que pode ser ?
Irei postar abaixo a tela de listagem de unidade para ver se acha algo errado
<?xml version=1.0 encoding=ISO-8859-1?> <!DOCTYPE html PUBLIC -//W3C//DTD XHTML 1.0 Transitional//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd> <html xmlns=http://www.w3.org/1999/xhtml xmlns:ui=http://java.sun.com/jsf/facelets xmlns:h=http://java.sun.com/jsf/html xmlns:f=http://java.sun.com/jsf/core xmlns:p=http://primefaces.prime.com.tr/ui> <h:body> <ui:insert name=boxTopo> <ui:include src=../../comum/estrutura/topo.xhtml /> </ui:insert> <div class=boxCorpo> <div class=corpo> <ui:insert name=boxMenu> <ui:include src=../../comum/estrutura/menu.xhtml /> </ui:insert> <div class=boxAbas> <h:outputLink styleClass=btAbaPesquisar title=Pesquisar>Pesquisar</h:outputLink> <h:outputLink styleClass=btAbaCadastrar title=Cadastrar>Cadastrar</h:outputLink> </div> <div class=boxConteudo> <p:growl id=gwlMansagem showDetail=true showSummary=true /> <h:form> <p:dataTable var=unidade value=#{UnidadeListagemBean.lazyModel} paginator=true rows=30 paginatorTemplate= rowsPerPageTemplate=30,45,60 lazy=true emptyMessage=#{MensagemBean.mensagemNenhumRegistroEncontado} dynamic=true> <p:column sortBy=# styleClass=tblListagemRisiRefeicoes> <f:facet name=header> <h:outputText value=Cliente /> </f:facet> <h:outputText value=#{unidade.cliente} /> </p:column> <p:column sortBy=# styleClass=tblListagemRisiRefeicoes> <f:facet name=header> <h:outputText value=Nome /> </f:facet> <h:outputText value=#{unidade.nome} /> </p:column> <p:column sortBy=# styleClass=tblListagemRisiRefeicoes tdStatus> <f:facet name=header> <h:outputText value=Status/> </f:facet> <h:commandLink action=#{UnidadeCadastroBean.AlteraStatus}> <h:graphicImage url=../../comum/img/#{unidade.status}.png/> <f:setPropertyActionListener target=#{UnidadeCadastroBean.unidade} value=#/> </h:commandLink> </p:column> <p:column styleClass=tblListagemRisiRefeicoes tdEditar> <f:facet name=header> <h:outputText value=Editar /> </f:facet> <h:commandLink action=#{UnidadeCadastroBean.Editar}> <h:graphicImage url=../../comum/img/edit.png/> <f:setPropertyActionListener target=#{UnidadeCadastroBean.unidade} value=#/> </h:commandLink> </p:column> </p:dataTable> </h:form> </div> </div> </div> </h:body> </html>
29/11/2011
Davi Costa
Pq talvez no seu converter crie um outro objeto na memória, mas com o mesmo id, o que já basta para vc.
Vai ter que ver bem na calma, o que pode estar causando isso. Debugar tudo mesmo. Honestamente não gosto da estratégia de vários beans na página...por exemplo: vc tem, senão me engano, um MensagemBean(algo assim) que vc só pega dele uma mensagem, que tal todos os seus benas extenderem de um pai que possua os métodos comuns a todos, ai vc mantém sua página apenas c um bean e fica mais fácil dar manutenção, debugar e por ai vai. Pode abusar da Orientação a Objetos.
att Davi
29/11/2011
Daniel Everling
Ao criar o hashCode e equals deixei eles serem gerados juntos, reparei que nas classes que funcionavam o hashCode e equals eram gerados apenas com atributos da entidade, mas não entendi o porque isso acontece, você saberia explicar-me ?
29/11/2011
Davi Costa
Ai ao rodar o converter não tenha esses mesmos atributos. Ao debugar, os clientes formados na listagem que fica na tela e cliente quando ele passa pelo converter, dá uma conferida se essses atributos estão instanciados.
att Davi
29/11/2011
Daniel Everling
@OneToMany(mappedBy = cliente, fetch = FetchType.LAZY, cascade = CascadeType.ALL) private List<Endereco> endereco;
e sim eles estao instanciados, ontem quando tava debugando parte a parte do que funcionava e do que estava com problema,
reparei que quando funcionava ao recarregar a pagina de listagem por exemplo (nesta pagina ele não passa pelo converter), os objetos eram os mesmos, por exemplo, classe.projeto.Estado.estado@utr1349d e ao recarregar a pagina de listagem de cliente esse objeto sempre era alterado, por isso pensei que poderia ser isso.
E agora o que remomendas, deixar o lazy ou tirá-lo ?
29/11/2011
Davi Costa
att Davi
29/11/2011
Davi Costa
Assim que possível fechar o chamado.
att Davi
29/11/2011
Davi Costa
att Davi
06/12/2011
Dyego Carmo
Resolvido ?
Se sim , por favor poderia fechar o chamado ?
Valeu !
06/12/2011
Daniel Everling
Clique aqui para fazer login e interagir na Comunidade :)