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.
A
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
D
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!
D
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.
A
aeciovc
blz, dev.rafael, como ficaria pra armazenar os Objetos??
pq quando tento fazer isso ele dá um erro de Null Converter.
D
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.
J
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.
J
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 !
D
dev.rafael
Cara, vou ver se arranjo um tempo para escrever um artigo e posto ae. Beleza?
A
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??
J
juniorsatanas
otimo vou ficar aqui no agurado, e estudando sobre o spring
T
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: