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:
jsf, selectonemenu
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