selectOneMenu selecionado com valor do bean

28/11/2011

0

Pessoal, não consigo trazer o valor de um selectOneMenu selecionado com o valor do bean
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

Daniel Everling

Responder

Posts

28/11/2011

Davi Costa

Observe bem na sua página vc usa dois benas diferentes,
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
Responder

28/11/2011

Daniel Everling

Ola Davi, irei testar, mas componente que retorna vazio é o cliente

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


Responder

28/11/2011

Daniel Everling

Ola davi fiz exatamente o que pediu mas não funcionou.

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 ???
Responder

28/11/2011

Daniel Everling

Davi, acho que estou ficando louco com esse erro.
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>

Responder

29/11/2011

Davi Costa

Para você verificar se est´vindo o certo, sobrescreve o método toString() da Classe Cliente e coloca como retorno o id.
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
Responder

29/11/2011

Daniel Everling

Ola davi eu consegui resolver, na classe cliente tenho um relacionamento bidirecional, para a classe endereco e contato.
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 ?
Responder

29/11/2011

Davi Costa

Talvez no seu mapeamento, ao capturar o cliente não pegue os atributos bidirecionais juntos. Está Lazy?
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
Responder

29/11/2011

Daniel Everling

Sim está com Lazy

@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 ?
Responder

29/11/2011

Davi Costa

Ai cara vai depender da app, se na maioria dos casos de uso, quando vc pegar o cliente vai precisar desses objetos, tira o lazy; senão deixa como está e faz as consultas dos objetos sob demanada a medida que precisar.

att Davi
Responder

29/11/2011

Daniel Everling

Ok, muito obrigado pela ajuda
Responder

29/11/2011

Davi Costa

Show de bola Daniel!
Assim que possível fechar o chamado.
att Davi
Responder

29/11/2011

Daniel Everling

hehehe, agora irá rir, mas como fecho o chamado ?
Responder

29/11/2011

Davi Costa

Se nã me engano tem uma opção no topo do chamado.

att Davi
Responder

06/12/2011

Dyego Carmo

Deu certo ?

Resolvido ?

Se sim , por favor poderia fechar o chamado ?

Valeu !
Responder

06/12/2011

Daniel Everling

Bom Dia Diego, eu gostaria de mudar o status do chamado para fechado ou resolvido, mas já vasculhei a página e não tem como também tentei alterar o titulo do post para [RESOLVIDO], mas não é possivel também.

Responder

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar