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.
@author Bruno
*/
public class ProjetoManaged implements Serializable {
private Projeto projeto;
public List<SelectItem> clientes = new ArrayList<SelectItem>();
private Cliente cliente = new Cliente();
private String cliente1;
/** Creates a new instance of ProjetoManaged */
public ProjetoManaged() {
projeto = new Projeto();
projeto.setCliente(cliente);
}
/**
@return the projeto
*/
public Projeto getProjeto() {
return projeto;
}
/**
@param projeto the projeto to set
*/
public void setProjeto(Projeto projeto) {
this.projeto = projeto;
}
public void cadastrar(ActionEvent event) {
System.out.println("Aquiiii: "+ cliente.getCodCliente());
System.out.println("Aquiiii: "+ cliente1);
GenericDAOImpl<Projeto, Integer> dao = new GenericDAOImpl();
this.projeto = dao.save(projeto);
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Informacao:", "Projeto " + projeto.getDescricao() + ", cadastrado com Sucesso!"));
}
public List<SelectItem> getClientes() {
List<Cliente> c = new ArrayList<Cliente>();
GenericDAOImpl<Cliente, Integer> dao = new GenericDAOImpl();
c = dao.getAll(new Cliente());
for (Cliente cliente : c) {
clientes.add(new SelectItem(cliente, cliente.getNome()));
}
return clientes;
}
public void valueChangeListener(ValueChangeEvent event) {
System.out.println("Cliente: " + event.getNewValue());
PhaseId phaseId = event.getPhaseId();
//pega o novo valor
Integer newValue = (Integer) event.getNewValue();
if (phaseId.equals(PhaseId.ANY_PHASE)) {
//agenda o evento para a fase que nos interessa
event.setPhaseId(PhaseId.UPDATE_MODEL_VALUES);
event.queue();
} else if (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
*/
public Cliente getCliente() {
return cliente;
}
/**
@param cliente the cliente to set
*/
public void setCliente(Cliente cliente) {
this.cliente = cliente;
}
/**
@return the cliente1
*/
public String getCliente1() {
return cliente1;
}
/**
@param cliente1 the cliente1 to set
*/
public void setCliente1(String cliente1) {
this.cliente1 = cliente1;
}
}
[/code]
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
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.
Modifique o seu método getClientes() disso:
public List<SelectItem> getClientes() {
List<Cliente> c = new ArrayList<Cliente>();
GenericDAOImpl<Cliente, Integer> dao = new GenericDAOImpl();
c = dao.getAll(new Cliente());
for (Cliente cliente : c) {
clientes.add(new SelectItem(cliente, cliente.getNome()));
}
return clientes;
}
… para isso:
public List<Cliente> getClientes() {
return new GenericDAOImpl().getAll(new Cliente());
}
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.
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.
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
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??[/quote]
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:
public List<Cliente> getClientes() {
return new GenericDAOImpl().getAll(new Cliente());
}
crie uma classe para converter
@FacesConverter(value="converteCliente", forClass=Cliente.class)
public class ConverteCliente implements Converter {
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {
return GenericDAOImpl().getCliente(Integer.valueOf(arg2));
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
return String.valueOf(((Cliente) arg2).getCodigoCliente());
}
}