Fórum selectOneMenu selecionado com valor do bean #409883
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
Curtir tópico
+ 1Posts
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
Gostei + 0
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.
Gostei + 0
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 ???
Gostei + 0
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>
Gostei + 0
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
Gostei + 0
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 ?
Gostei + 0
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
Gostei + 0
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 ?
Gostei + 0
29/11/2011
Davi Costa
att Davi
Gostei + 0
29/11/2011
Daniel Everling
Gostei + 0
29/11/2011
Davi Costa
Assim que possível fechar o chamado.
att Davi
Gostei + 0
29/11/2011
Daniel Everling
Gostei + 0
29/11/2011
Davi Costa
att Davi
Gostei + 0
06/12/2011
Dyego Carmo
Resolvido ?
Se sim , por favor poderia fechar o chamado ?
Valeu !
Gostei + 0
06/12/2011
Daniel Everling
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)