Recuperar Id p:selectOneMenu

Boa tarde,

Eu tenho uma página xhtml com um combo com primefaces, e nele eu carrego através de um SelectItem que contém uma descrição e o id do objeto.

				<h:outputLabel value="Perfil:" for="perfil"/>
				<p:selectOneMenu id="selecionarPerfil" value="#{usuarioBean.perfil}" effect="fold" editable="true" style="width:160px">
  					<f:selectItems value="#{perfilBean.perfis}" />
				</p:selectOneMenu>

Porém qdo eu tento recuperar o id do meu item do combo, ele me retorna a descrição.
Já vi alguns posts aqui no guj, mas naum me resolveram mto a vida.

Alguem tem uma sugestão?
Valews!

Dentro do selectItens crie um var=“carro” e depois use itemLabel="#{carro.nome}" itemValue="#{carro.id}"

Basta trocar pelo seu cenário.

Acho q naum, porq na verdade o meu código eh esse…

<h:outputLabel value="Perfil:" for="perfil"/>
				<p:selectOneMenu id="selecionarPerfil" value="#{usuarioBean.perfil}" effect="fold" editable="true" style="width:160px">
  					<!-- <f:selectItems value="#{perfilBean.perfis}" var="perfil" itemLabel="#{perfil.descricao}" itemValue="#{perfil.perfilId}"/> -->  
  					<f:selectItems value="#{perfilBean.perfis}" />
				</p:selectOneMenu>

Soh tirei a linha comentada pra postar no forum hehe
mas já tinha feito desta maneira.

O que o Hebert disse está correto. Você tem que fazer daquela forma para funcionar.

Porém, você disse que quando coloca o id ele exibe a descrição. Como você está preenchendo a sua lista?

Então,

Eu fiz das duas formas, uma do primeiro post, e a outra do segundo post, com a linha comentada.
Esse é o método q eu preencho o SelectItem

	public Collection<SelectItem> getPerfis() {
		if(perfis == null){
			List<Perfil> listaPerfis = new ArrayList<Perfil>();
			perfis                   = new ArrayList<SelectItem>();
			
			listaPerfis = listarTodosPerfis();
			
			for(Perfil perfil : listaPerfis){
				perfis.add(new SelectItem(perfil.getPerfilId(), perfil.getDescricao()));
			}
		}
		return perfis;
	}

Segundo o BalusC nesse post aqui:

O Collection não é suportado pelo JSF. Tente mudar para List, Map ou Array.

Estranho, talvez o post seja antigo. Vi um post no guj que pedia justamente o contrário, para mudar de List para Collection.
Em todo caso, alterei para List, mas não surtiu efeito nenhum. Mesmo erro.

O post é de junho desse ano. Eu verifiquei antes pq também achei estranho, mas vamos lá…

Só para esclarecer, o problema está em exibir as informações na combo ou é quando você submete o formulário, você não consegue recuperar as informações no controller?

Não não, o combo tah funfando legal, tah me mostrando a descrição certinha.
O problema tah qdo eu pego a informação da tela pra persistir, e eu ia pegar o id do combo, mas ela está vindo com a descrição.
A partir do id eu busco o objeto, mas como eu tenho a descrição vinda do combo, eu tenho um erro pois o retorno da busca eh nula.

Valews!

Como que você está recuperando o valor na sua controller?

Aqui eu seto o id que está vindo como descrição, na string “perfil” no meu managed bean

<p:selectOneMenu id="selecionarPerfil" value="#{usuarioBean.perfil}" effect="fold" editable="true" style="width:160px">

E aqui eu tenho um método que faz a busca do perfil através do id, antes de salvar o objeto:

public String salvar(){
		FacesContext context = FacesContext.getCurrentInstance();
		
		if(!getUsuario().getSenha().equals(getConfirmarSenha())){
			adicionarMensagem(ERRO_SENHA, context);
			return null;
		}
		
		if(getUsuarioFacade().existeUsuario(getUsuario().getLogin())){
			adicionarMensagem(ERRO_USUARIO_CADASTRADO, context);
			return null;
		}
		
		try {
			getUsuario().setPerfil(getUsuarioFacade().listarPerfil(getPerfil()));
			getUsuario().setDataCadastro(new Date());
			getUsuario().setStatus(STATUS_ATIVO);
			getUsuario().setSenha(GeraMD5.gerar(getUsuario().getSenha()));
			
			getUsuarioFacade().salvarUsuario(getUsuario());

Onde o getPerfil() eh soh um getter pra String perfil, e o usuarioFacade encapsula os meus métodos de busca.

Valews

String perfil? O seu perfilId é do tipo String tb?

De qualquer forma, tente com essas modificações aqui:

Componente

<p:selectOneMenu id="selecionarPerfil" value="#{usuarioBean.perfil}" effect="fold" editable="true" style="width:160px">  
    <f:selectItems value="#{perfilBean.perfis}" var="perfil" itemLabel="#{perfil.descricao}" itemValue="#{perfil.perfilId}"/>
</p:selectOneMenu>  

Método que preenche a lista

public List<Perfil> getPerfis() {  
        return listarTodosPerfis();  
}  

Estou supondo que a tanto a propriedade perfil da sua classe UsuarioBean quanto o perfilId sejam do tipo String. Certo?

Isso mesmo, perfil e o id do meu objeto são strings.
Tbem deste jeito naum foi =(

Valews

É…to ficando sem opção. Mas, por curiosidade, tente mudar o nome do var no selectItems:

<p:selectOneMenu id="selecionarPerfil" value="#{usuarioBean.perfil}" effect="fold" editable="true" style="width:160px">    
    <f:selectItems value="#{perfilBean.perfis}" var="objPerfil" itemLabel="#{objPerfil.descricao}" itemValue="#{objPerfil.perfilId}"/>  
</p:selectOneMenu>

Como o nome do var era o mesmo da propriedade no Bean, talvez pode haver algum problema nisso daí.

Nada ainda, tbem esta opção naum funciona.
O engraçado é que tirando o p:selectOneMenu do prime e colocando o combo do próprio faces h:selectOneMenu eu consigo oq eu qro.

[quote=erick.yuji]Nada ainda, tbem esta opção naum funciona.
O engraçado é que tirando o p:selectOneMenu do prime e colocando o combo do próprio faces h:selectOneMenu eu consigo oq eu qro.[/quote]Sua classe tem hashCode e equals corretamente criados?

Equals e HashCodes gerados pelo Eclipse hehe