Não sei se eu te entendi direito, tente return uma lista de objetos do tipo Cliente, da maneira que você está construindo
o seu SelectOne você não precisa converter os dados para SelectItem. Confirma ai se você está usando JSF 2 ou 1.2.
Se não funcionar posta um pouco mais de código, porque esse ai não esclareceu muito.
aeciovc
estou usando JSF 2.
esse é meu Bean Gerenciado:
/* * To change this template, choose Tools | Templates * and open the template in the editor. */packagebr.kmf.controller;importbr.kmf.bean.Cliente;importbr.kmf.bean.Projeto;importbr.kmf.dao.GenericDAOImpl;importjava.io.Serializable;importjava.util.ArrayList;importjava.util.List;importjavax.faces.application.FacesMessage;importjavax.faces.context.FacesContext;importjavax.faces.event.ActionEvent;importjavax.faces.event.PhaseId;importjavax.faces.event.ValueChangeEvent;importjavax.faces.model.SelectItem;/** * * @author Bruno */publicclassProjetoManagedimplementsSerializable{privateProjetoprojeto;publicList<SelectItem>clientes=newArrayList<SelectItem>();privateClientecliente=newCliente();privateStringcliente1;/** Creates a new instance of ProjetoManaged */publicProjetoManaged(){projeto=newProjeto();projeto.setCliente(cliente);}/** * @return the projeto */publicProjetogetProjeto(){returnprojeto;}/** * @param projeto the projeto to set */publicvoidsetProjeto(Projetoprojeto){this.projeto=projeto;}publicvoidcadastrar(ActionEventevent){System.out.println("Aquiiii: "+cliente.getCodCliente());System.out.println("Aquiiii: "+cliente1);GenericDAOImpl<Projeto,Integer>dao=newGenericDAOImpl();this.projeto=dao.save(projeto);FacesContext.getCurrentInstance().addMessage(null,newFacesMessage(FacesMessage.SEVERITY_INFO,"Informacao:","Projeto "+projeto.getDescricao()+", cadastrado com Sucesso!"));}publicList<SelectItem>getClientes(){List<Cliente>c=newArrayList<Cliente>();GenericDAOImpl<Cliente,Integer>dao=newGenericDAOImpl();c=dao.getAll(newCliente());for(Clientecliente:c){clientes.add(newSelectItem(cliente,cliente.getNome()));}returnclientes;}publicvoidvalueChangeListener(ValueChangeEventevent){System.out.println("Cliente:"+event.getNewValue());PhaseIdphaseId=event.getPhaseId();//pega o novo valorIntegernewValue=(Integer)event.getNewValue();if(phaseId.equals(PhaseId.ANY_PHASE)){//agenda o evento para a fase que nos interessaevent.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);event.queue();}elseif(phaseId.equals(PhaseId.UPDATE_MODEL_VALUES)){//aqui vai o método de antes (um pouco mudado)this.cliente.setCodCliente(newValue);cliente1=String.valueOf(newValue);}}/** * @return the cliente */publicClientegetCliente(){returncliente;}/** * @param cliente the cliente to set */publicvoidsetCliente(Clientecliente){this.cliente=cliente;}/** * @return the cliente1 */publicStringgetCliente1(){returncliente1;}/** * @param cliente1 the cliente1 to set */publicvoidsetCliente1(Stringcliente1){this.cliente1=cliente1;}}
tem algumas coisas como esse cliente1 que tava colocando pra testar!
a questão é que essa linha <f:selectItems value="#{projetoManaged.clientes}" var="cliente" itemLabel="#{cliente.nome}" itemValue="#{cliente.codCliente}"/> ele não pega o itemValue. e quando vai Validar o Bean não passa, o que não acontece se eu usar estaticamente o selectItem
dev.rafael
Me parece que o seu problema é que o seu método getClientes() está retornando um List mas a sua viu
está tentando acessar os atributos dos items como se esses fossem do tipo Cliente.
funcionou sim. mas algumas questões agora me deixaram na dúvida.
primeiro: da forma que está eu não estou trabalhando com Objetos no selectOne certo??
existe como fazer isso, ou seja no lugar do vaor dele ser o codCliente inteiro ser o objeto Cliente??
outra coisa estranha é que achei que tinha que retornar o SelectItens assim como vi em muitos tutorias do JSF 2. isso mudou do JSF 1.2 e 2??
mas tá funcionando direitinho… so isso que fiquei em duvida agora!
dev.rafael
PRIMEIRO:
Sim é possível fazer isso e inclusive é aconselhável que você o faça pois dessa forma o componente vai armazenar os objetos
Cliente ficando mais fácil para escrever um converter que entregue o objeto para o seu ManagedBean e não o código dele. Ai
segue as modificações que você precisa fazer no seu código, apenas o valor do atributo itemValue.
SEGUNDO:
Antes do JSF 2 a tag f:selectItems não possuía os atributos var, itemLabel e itemValue, essas informações eram obtidas através
dos atributos dos objetos SelectItem retornados. O problema, como você pode perceber, é que dessa forma você sempre precisava
converter os objetos das suas listas para SelectItem, o que é massante e trabalhoso. Com esses três atributos é possível que seus
ManagedBeans retornem a lista de dados sem nenhum tipo de processamento prévio, ou seja, assim como ela veio do banco.
aeciovc
blz, dev.rafael, como ficaria pra armazenar os Objetos??
pq quando tento fazer isso ele dá um erro de Null Converter.
dev.rafael
Acho que não entendi, o que você quer dizer com “armazenar os Objetos”? Você quer armazena-los onde?
Com relação ao seu erro, poste o stackTrace da sua exceção.
juniorsatanas
aeciovc Isso é um sistema ? caralho fiquei bolado… muito legal jsf 2
Tu tem mais codigo para postar aqui ? gostaria de dar um Contro C + Control V, para fazer um CRUD.
abraço.
juniorsatanas
publicvoidcadastrar(ActionEventevent){System.out.println("Aquiiii: "+cliente.getCodCliente());System.out.println("Aquiiii: "+cliente1);GenericDAOImpl<Projeto,Integer>dao=newGenericDAOImpl();this.projeto=dao.save(projeto);FacesContext.getCurrentInstance().addMessage(null,newFacesMessage(FacesMessage.SEVERITY_INFO,"Informacao:","Projeto "+projeto.getDescricao()+", cadastrado com Sucesso!"));}
da ate pra ver que ta usando Facade !
dev.rafael
Cara, vou ver se arranjo um tempo para escrever um artigo e posto ae. Beleza?
aeciovc
blz dev.rafael…
minha questão de armazenar os Objetos é no selectOneMenu mesmo… pq da forma que fiz no meu selectItems eu to usando o ItemValue como cliente.codCliente e não como o Objeto = cliente
entende??
juniorsatanas
otimo vou ficar aqui no agurado, e estudando sobre o spring
tonyam
aeciovc:
blz dev.rafael…
minha questão de armazenar os Objetos é no selectOneMenu mesmo… pq da forma que fiz no meu selectItems eu to usando o ItemValue como cliente.codCliente e não como o Objeto = cliente
entende??
Caro aeciovc
veja:
primeiro crie os metodos hashCode e equals da sua classe cliente
Na seu managed bean a classe que retorna a lista pode ser assim: