JSF 2.0 - Como pegar objeto inteiro no selectOneMenu

34 respostas
R

Boa tarde pessoal,

Estou com um problema para pegar objetos selecionados no combo, estive pesquisando e ouvi falar sobre converters e em alguns casos vi que ele nao é necessário.

Eu fiz da seguinte maneira. Criei um atributo no MB que receberia esse objeto selecionado, mas por alguma razao ele nao está setando o atributo.

Abaixo segue meu código para ajudar.

Bean

@ManagedBean(name = "nivelOrganizacionalController")
@ViewScoped
public class NivelOrganizacionalController {
    
    PreTarefaEntity preTarefa;

    public void associarPreTarefa(){
        PreTarefaNivelOrganizacionalEntity preTarefaNO = new PreTarefaNivelOrganizacionalEntity();
        preTarefaNO.setPreTarefa(preTarefa);
        preTarefaNO.setNivelOrganizacional(nivelOrganizacional);
        nivelOrganizacionalDAO.salvar(preTarefaNO);
     }

     public PreTarefaEntity getPreTarefa() {
        return preTarefa;
    }

    public void setPreTarefa(PreTarefaEntity preTarefa) {
        this.preTarefa = preTarefa;
    }

***O atributo preTarefa é o que deveria receber o objeto do combo.

XHTML

<h:selectOneMenu value="#{nivelOrganizacionalController.preTarefa}">
              <f:selectItem itemLabel="Selecione" itemValue="" noSelectionOption="true" />
             <f:selectItems value="#{preTarefaController.comboPreTarefa}" var="preTarefa" itemLabel="#{preTarefa.nome}" itemValue="#{preTarefa.idPreTarefa}"/>
         </h:selectOneMenu> 

Se puderem me ajudar ficarei extremamente agradecido! Abraços!

34 Respostas

A

cara,

vc tem que criar um custom converter.

t+

F

No JSF 2 da para pegar direto sem converter mas não sei aonde eu vi…De uma procurada.

L

Eu tinha visto que dava, só que até hoje não achei onde.
Use converter

R

Estou lendo aqui a respeito, já implementei um exemplo sem converter, mas ano funcionou, vou tentar com converter mesmo! Muito obrigado a todos!

E

.

F

Esta ai sem conversor:

<h:SelectOneMenu disabled="#{caminhaoBean.aplicacao.podeAlterar}" value="#{caminhaoBean.caminhao.cliente}" id="listaCliente" style="width:350px"> <f electItem itemLabel="Selecione" itemValue="" /> <f electItems value="#{clienteBean.colecao}" var="x" itemLabel="#{x.nomeFantasia}" itemValue="#{x}" /> <f:ajax render="listaCliente" execute="@this" /> </h electOneMenu>

L

FernandoFranzini:
Esta ai sem conversor:

<h:SelectOneMenu disabled="#{caminhaoBean.aplicacao.podeAlterar}" value="#{caminhaoBean.caminhao.cliente}" id="listaCliente" style="width:350px"> <f electItem itemLabel="Selecione" itemValue="" /> <f electItems value="#{clienteBean.colecao}" var="x" itemLabel="#{x.nomeFantasia}" itemValue="#{x}" /> <f:ajax render="listaCliente" execute="@this" /> </h electOneMenu>

Ja fiz assim e não funcionou pelo menos comigo tanto que ao usar o converter fica igual o codigo nao muda apenas adiciona o converter

L

Já passei pelo mesmo problema ha algum tempo atrás e posto aqui a minha solução para JSF 2 usando prime faces. Tenho tb uma solução para JSF 1 usando richfaces, quem tiver interesse postar aqui que eu mando.

JSF 2.0 COM PRIME FACES.

[color=red]ANTES DE COMEÇAR É NECESSÁRIO DIZER QUE PARA A SOLUÇÃO ABAIXO FUNCIONAR VOCÊ TEM QUE NA CLASSES DE SUAS ENTIDADES VOCÊ SOBRESCREVER EXPLICITAMENTE OS MÉTODOS equals E hashcode. Para o exemplo abaixo funcionar a classe Cliente teria que sobrescrever o método equals e hashcode. Como você não vai ta fazendo isso em todas as suas classes de entidade, então basta criar uma superclasse abstrata de entidade e sobrescrever esses métodos lá e todas as entidades estendenrão desta. Por exemplo uma classe chamada Entidade que é abstrata.[/color]

[color=red]OUTRA COISA IMPORTANTE É QUE DA FORMA COMO O CONVERTER ESTA IMPLEMENTADO ABAIXO ELE ESPERA QUE O ITEM TENHA UM ATRIBUTO CHAMADO 'id' QUE É O IDENTIFICADOR NORMALMENTE USADO PARA ENTIDADES. CASO NO SEU PROJETO TENHA OUTRO PADRÃO FIQUE A VONTADE PARA MUDAR A PROPRIEDADE NO MÉTODO getIdByReflection DO CONVERTER.[/color]

Para tal é necessário colocar o converter abaixo:

import java.lang.reflect.Field;
import java.util.Collection;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;

/**
 * 
 * @author Victor Lindberg
 *
 */
@FacesConverter("selectOneUsingObjectConverter")
public class SelectOneUsingObjectConverter implements Converter{
	
	@Override
    public Object getAsObject(FacesContext context,
        UIComponent component, String value) {
        if (value == null || value.equals(""))
            return null;

        try{
        	Long id = Long.valueOf(value);
        	Collection items =  (Collection) component.getAttributes().get("items");
        	return findById(items, id);
        }catch(Exception ex){
        	throw new ConverterException("Não foi possível aplicar conversão de item com valor ["+value+"] no componente ["+component.getId()+"]", ex);
        }
    }
	
    @Override
	public String getAsString(FacesContext context, UIComponent component,
			Object value) {
		if (value == null)
			return "";
		
		return getIdByReflection(value).toString();
	}
    
    private Object findById(Collection collection, Long idToFind){
    	for (Object obj : collection){
    		 Long id = getIdByReflection(obj);
    		 if (id == idToFind)
    			 return obj;
    	}
    	
    	return null;
    }
    
    private Long getIdByReflection(Object bean){
    	try{
    		Field idField = bean.getClass().getDeclaredField("id");
    		idField.setAccessible(true);
    		return (Long) idField.get(bean);
    	}catch(Exception ex){
    		throw new RuntimeException("Não foi possível obter a propriedade 'id' do item",ex);
    	}
    }

}

Nosso MB:

import java.util.List;

import javax.faces.bean.ManagedBean;

/**
 * 
 * @author Victor Lindberg
 * 
 */
@ManagedBean("clienteMB")
public class ClienteMB {
	
	private List<Cliente> listaClientes;

	private Cliente clienteSelecionado;

	public List<Cliente> getListaClientes() {
		//carrega a lista de clientes
		return listaClientes;
	}

	public void setListaClientes(List<Cliente> listaClientes) {
		this.listaClientes = listaClientes;
	}

	public Cliente getClienteSelecionado() {
		return clienteSelecionado;
	}

	public void setClienteSelecionado(Cliente clienteSelecionado) {
		this.clienteSelecionado = clienteSelecionado;
	}
	
}

Então para usar basta definir ele como sendo o converter e colocar explicitamente um atributo chamado 'items' na tag selectOneMenu como abaixo.

<p:selectOneMenu id="combo" value="#{clienteMB.clienteSelecionado}" 
                           converter="selectOneUsingObjectConverter" items="#{clienteMB.listaClientes}">  
        <f:selectItem itemLabel="Selecione" itemValue="" />  
        <f:selectItems value="#{clienteMB.listaClientes}" var="cliente" itemLabel="#{cliente.nome}" itemValue="#{cliente}" />  
</p:selectOneMenu>

Pronto, nossa combo do JSF ta funcionando belezinha.

É isso ai, qualquer coisa posta ae.

Victor Lindberg

K

Excelente lindberg713

Descuple ressuscitar o post, mas assim como eu, outros podem precisar disto.

No meu caso, eu uso primefaces (é idêntico ao post do lindberg713):
<p:selectOneMenu style="width:45px;" 
	converter="selectOneConverter" items="#{manterPessoasBean.ufs}">						
	<p:ajax event="change" listener="#{manterPessoasBean.setarUf}"  update="@form" />
	<f:selectItems value="#{manterPessoasBean.ufs}" var="uf"
	itemLabel="#{uf.sigla}" itemValue="#{uf}"/>
</p:selectOneMenu>
Mas vejam que usei com um listener. O listener ficou assim:
public void setarUf(javax.faces.event.AjaxBehaviorEvent event){		
	Map<String, Object> map = event.getComponent().getAttributes();		
	uf = (Uf) map.get("value");		
}
... e é claro, sobrescrevendo os metodos equals e hashCode da classe de dominio - basta acrescentar o código abaixo (no meu caso Uf):
public boolean equals(Object other){
	return other instanceof Uf && equals((Uf)other);
}

public boolean equals (Uf other){
	return this.id.equals(other.id);
}

public int hashCode(){
	return id.hashCode();
}
	
public String toString(){
	return this.nome;
}
Assim funciona melhor do que as outras abordagens mostradas neste post, pelo menos com primefaces. Fui...
L
knik:
Excelente lindberg713

Descuple ressuscitar o post, mas assim como eu, outros podem precisar disto.

No meu caso, eu uso primefaces (é idêntico ao post do lindberg713):
<p:selectOneMenu style="width:45px;" 
	converter="selectOneConverter" items="#{manterPessoasBean.ufs}">						
	<p:ajax event="change" listener="#{manterPessoasBean.setarUf}"  update="@form" />
	<f:selectItems value="#{manterPessoasBean.ufs}" var="uf"
	itemLabel="#{uf.sigla}" itemValue="#{uf}"/>
</p:selectOneMenu>
Mas vejam que usei com um listener. O listener ficou assim:
public void setarUf(javax.faces.event.AjaxBehaviorEvent event){		
	Map<String, Object> map = event.getComponent().getAttributes();		
	uf = (Uf) map.get("value");		
}
... e é claro, sobrescrevendo os metodos equals e hashCode da classe de dominio - basta acrescentar o código abaixo (no meu caso Uf):
public boolean equals(Object other){
	return other instanceof Uf && equals((Uf)other);
}

public boolean equals (Uf other){
	return this.id.equals(other.id);
}

public int hashCode(){
	return id.hashCode();
}
	
public String toString(){
	return this.nome;
}
Assim funciona melhor do que as outras abordagens mostradas neste post, pelo menos com primefaces. Fui...

Amigo, não considero essa sua abordagem melhor do que as outras. Veja que a ideia que passei aqui é que seja transparente, ou seja, você define seu selectOneMenu , define seus itens, define qual é o value dele (onde o valor selecionado será setado), e pronto só isso. O converter faz o resto para você sempre do mesmo jeito e para todos os casos, atributos e selectOneMenus que você tenha.

Usando a sua abordagem, você sempre terá que criar esse método listener para cada atributo e caso separadamente. Visto que você vai ter que obter o valor correto do map de atributos, fazer o cast e setar no local correto dentro do seu managedbean. Eu não acho essa abordagem uma boa escolha. E te digo mais, isso que você fez é redundante pois nesse trecho de código que vc postou do selectOneMenu usando o converter que eu postei anteriormente + o atributo items, quando o jsf invocar o seu metodo listener manterPessoasBean.setarUf o jsf já teria setado o valor selecionado na combo corretamente no atributo correspondente definido no value pois a chamada ao método do listener será feita na fase de 4 do jsf (Update Model Values) e depois disso só entao o seu listerner ou action será chamado na fase 5 (Invoke Application). Então você vai ta fazendo algo redundante e que ja ta sendo feito automaticamente e pra todos os casos bastando apenas usar o converter e o atributo extra 'items'.

K

ooops foi mal lindberg713.

Você tem a inteira razão, eu me esqueci de dizer que estou usando duas combos. Entao precisa sim do listener, para setar a segunda combo com as cidades da uf selecionada, no mais você tem razao, usando apenas uma combo o listener é totalmente dispensável.

Parabéns pela sua idéia e obrigado.

L

Em casos como este onde se precisa efetuar uma ação em função de um item selecionado na combo, como por exemplo listar os estados em uma combo em função de um pais selecionado em outra combo, claro que é necessário um actionlistener ou um simples action. Mas uma coisa nao tem nada haver com a outra. A solução tratada aqui é para se obter setando na value da combo o item selecionado diretamente sem a necessidade de se criar converters especificos para isto.

Mas entendi o que você quis dizer. So quis deixar claro que o listener nao tem nada haver com a solução discutida aqui. Mas sempre é bom receber os feedbacks. Estamos todos aqui é pra isso mesmo, pra discutir e unir forças em prol de um senso comum.

Abraço.

S

Cara, vi isso no Blog do Rafael Pontes http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/
Eu encontrei agora e achei interessante, ainda não implementei mas é semelhante a solução já apresentada aqui, com mais um exemplo e considerações.
o que acham? é assim mesmo ou já tem outra forma, biblioteca, etc…

obg,

S

O lindberg713 , só faltou uma coisa a dizer, tem que mapear esse conveter num xml?

L

Opa. Se você estiver usando JSF 2, não precisa mapear nada. Observe que o converter está anotado com @FacesConverter. No JSF 2 não precisa pois ele já detecta e registra os converters (e validadores tb) anotados. Se estiver usando JSF 1, é necessário mapear no faces-config.xml.

Quanto ao exemplo que você passou no link http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/, não testei ainda mas pelo que vi é semelhante ao apresentado aqui sim. Só não sei se essa forma de pegar implicitamente o objeto selecionado a partir de component.getAttributes().get(value) funciona para todos os casos. A solução que postei aqui funciona sempre pois passamos a lista contendo os valores possiveis sempre, então independente do que aconteça, o valor selecionado será obtido corretamente. Ma a solução do post é a mesma apresentada aqui só que sem a necessidade do atributo ‘items’. Quem quiser testar em diversos casos e nos devolver um feedback, seja bem vindo.

S

Opa. Se você estiver usando JSF 2, não precisa mapear nada. Observe que o converter está anotado com @FacesConverter. No JSF 2 não precisa pois ele já detecta e registra os converters (e validadores tb) anotados. Se estiver usando JSF 1, é necessário mapear no faces-config.xml.

Quanto ao exemplo que você passou no link http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/, não testei ainda mas pelo que vi é semelhante ao apresentado aqui sim. Só não sei se essa forma de pegar implicitamente o objeto selecionado a partir de component.getAttributes().get(value) funciona para todos os casos. A solução que postei aqui funciona sempre pois passamos a lista contendo os valores possiveis sempre, então independente do que aconteça, o valor selecionado será obtido corretamente. Ma a solução do post é a mesma apresentada aqui só que sem a necessidade do atributo ‘items’. Quem quiser testar em diversos casos e nos devolver um feedback, seja bem vindo.

Opa, de fato, JSF2+anotations “belo casal”. nem preciasa mesmo do xml.

Bom eu testei a segunda implementação citada pelo Rafael Pontes(SimpleEntityConverter), que recupera o objeto do selectItem através do seu “index”. A grande vantagem é que pode ser usado em qualquer “selectOneMenu” com qualuqer objeto sem ter que mudar teus “Entities(Beans)” a não ser o métodos “equals” e “hashCode”, o único problema/incoveniente que encontrei é que no o meu método, por exemplo, getCidades deve retornar um List e não um List, mas talvez seja apenas uma falta de atenção minha em mudar alguma coisa, o fato é que fiquei ontem o dia inteiro a procura dessa solução e só consegui fazer funcionar lá pelas 4 da madruga com essa idéia… ops, “ideia”.
Agora(13h00 em Rondônia) to no trampo, que não tem nada a ver com isso, e não tenho como postar código e tals, mas chegando em cada faço um resumo com o que consegui implementar e vcs sugiram, critiquem, comentem, etc…

S

deu “tiute” aqui e acabei editando, enviei duas vezes.

L

Opa. Se você estiver usando JSF 2, não precisa mapear nada. Observe que o converter está anotado com @FacesConverter. No JSF 2 não precisa pois ele já detecta e registra os converters (e validadores tb) anotados. Se estiver usando JSF 1, é necessário mapear no faces-config.xml.

Quanto ao exemplo que você passou no link http://www.rponte.com.br/2008/07/26/entity-converters-pra-da-e-vender/, não testei ainda mas pelo que vi é semelhante ao apresentado aqui sim. Só não sei se essa forma de pegar implicitamente o objeto selecionado a partir de component.getAttributes().get(value) funciona para todos os casos. A solução que postei aqui funciona sempre pois passamos a lista contendo os valores possiveis sempre, então independente do que aconteça, o valor selecionado será obtido corretamente. Ma a solução do post é a mesma apresentada aqui só que sem a necessidade do atributo ‘items’. Quem quiser testar em diversos casos e nos devolver um feedback, seja bem vindo.

Opa, de fato, JSF2+anotations “belo casal”. nem preciasa mesmo do xml.

Bom eu testei a segunda implementação citada pelo Rafael Pontes(SimpleEntityConverter), que recupera o objeto do selectItem através do seu “index”. A grande vantagem é que pode ser usado em qualquer “selectOneMenu” com qualuqer objeto sem ter que mudar teus “Entities(Beans)” a não ser o métodos “equals” e “hashCode”, o único problema/incoveniente que encontrei é que no o meu método, por exemplo, getCidades deve retornar um List e não um List, mas talvez seja apenas uma falta de atenção minha em mudar alguma coisa, o fato é que fiquei ontem o dia inteiro a procura dessa solução e só consegui fazer funcionar lá pelas 4 da madruga com essa idéia… ops, “ideia”.
Agora(13h00 em Rondônia) to no trampo, que não tem nada a ver com isso, e não tenho como postar código e tals, mas chegando em cada faço um resumo com o que consegui implementar e vcs sugiram, critiquem, comentem, etc…

Não analisei o código para verificar se de fato a lista de items tem que ser obrigatoriamente de SelectItem. Se for, essa solução para mim já passa a ser mesmo recomendada pelo fato de que vc sempre vai ter que criar uma lista e popula-la com selectitems toda vez em todos os atributos e para cada selectonemenu.

A solução que propus te deixa livre deste problema. Visto que ela pega uma coleção diretamente com os objetos. Então vc não precisa fazer nada disso, fica transparente pois pega diretamente o valor da collection de items do bean em questão.

S

É, também não analisei muito sobre o List, apenas resolvi meu problema de “usuario.cidade” receber um “objeto - Cidade - selecionado no selectOneMenu” mais tarde testo mais e posto comentários.

ps.: objeto Cidade entre aspas né.

L

Shoknes:
É, também não analisei muito sobre o List, apenas resolvi meu problema de “usuario.cidade” receber um “objeto - Cidade - selecionado no selectOneMenu” mais tarde testo mais e posto comentários.

ps.: objeto Cidade entre aspas né.

Ok, mas fique atento pois você resolveu o seu problema especifico e pontual. Fique ciente que certamente vai precisar fazer a mesma coisa em vários outros lugares e em inúmeras situações. Para evitar trabalhao e retrabalho desnecessarios, considere usar a solução proposta no post.

S

Então lindberg713, eu tô supondo até aqui que esse SimpleIndexConverter é reutilizável e inclusive poderá ser único à aplicação, será que estou enganado?

L

Cara, no momento to cheio de coisa e nao da pra eu parar e avaliar isso. Se vc puder avaliar isso e dar o feedback pra o pessoal seria muito bem vindo.

Abraço.

S

Shoknes:

o único problema/incoveniente que encontrei é que no o meu método, por exemplo, getCidades deve retornar um List e não um List, mas talvez seja apenas uma falta de atenção minha .

Ah cara, só pra deixa claro o incoveniente que eu falei aqui, é no ManagedBean e não em outros Etities, por exemplo Estado.

H
lindberg713:
Já passei pelo mesmo problema ha algum tempo atrás e posto aqui a minha solução para JSF 2 usando prime faces. Tenho tb uma solução para JSF 1 usando richfaces, quem tiver interesse postar aqui que eu mando.

JSF 2.0 COM PRIME FACES.

[color=red]ANTES DE COMEÇAR É NECESSÁRIO DIZER QUE PARA A SOLUÇÃO ABAIXO FUNCIONAR VOCÊ TEM QUE NA CLASSES DE SUAS ENTIDADES VOCÊ SOBRESCREVER EXPLICITAMENTE OS MÉTODOS equals E hashcode. Para o exemplo abaixo funcionar a classe Cliente teria que sobrescrever o método equals e hashcode. Como você não vai ta fazendo isso em todas as suas classes de entidade, então basta criar uma superclasse abstrata de entidade e sobrescrever esses métodos lá e todas as entidades estendenrão desta. Por exemplo uma classe chamada Entidade que é abstrata.[/color]

[color=red]OUTRA COISA IMPORTANTE É QUE DA FORMA COMO O CONVERTER ESTA IMPLEMENTADO ABAIXO ELE ESPERA QUE O ITEM TENHA UM ATRIBUTO CHAMADO 'id' QUE É O IDENTIFICADOR NORMALMENTE USADO PARA ENTIDADES. CASO NO SEU PROJETO TENHA OUTRO PADRÃO FIQUE A VONTADE PARA MUDAR A PROPRIEDADE NO MÉTODO getIdByReflection DO CONVERTER.[/color]

Para tal é necessário colocar o converter abaixo:

import java.lang.reflect.Field;
import java.util.Collection;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;

/**
 * 
 * @author Victor Lindberg
 *
 */
@FacesConverter("selectOneUsingObjectConverter")
public class SelectOneUsingObjectConverter implements Converter{
	
	@Override
    public Object getAsObject(FacesContext context,
        UIComponent component, String value) {
        if (value == null || value.equals(""))
            return null;

        try{
        	Long id = Long.valueOf(value);
        	Collection items =  (Collection) component.getAttributes().get("items");
        	return findById(items, id);
        }catch(Exception ex){
        	throw new ConverterException("Não foi possível aplicar conversão de item com valor ["+value+"] no componente ["+component.getId()+"]", ex);
        }
    }
	
    @Override
	public String getAsString(FacesContext context, UIComponent component,
			Object value) {
		if (value == null)
			return "";
		
		return getIdByReflection(value).toString();
	}
    
    private Object findById(Collection collection, Long idToFind){
    	for (Object obj : collection){
    		 Long id = getIdByReflection(obj);
    		 if (id == idToFind)
    			 return obj;
    	}
    	
    	return null;
    }
    
    private Long getIdByReflection(Object bean){
    	try{
    		Field idField = bean.getClass().getDeclaredField("id");
    		idField.setAccessible(true);
    		return (Long) idField.get(bean);
    	}catch(Exception ex){
    		throw new RuntimeException("Não foi possível obter a propriedade 'id' do item",ex);
    	}
    }

}

Nosso MB:

import java.util.List;

import javax.faces.bean.ManagedBean;

/**
 * 
 * @author Victor Lindberg
 * 
 */
@ManagedBean("clienteMB")
public class ClienteMB {
	
	private List<Cliente> listaClientes;

	private Cliente clienteSelecionado;

	public List<Cliente> getListaClientes() {
		//carrega a lista de clientes
		return listaClientes;
	}

	public void setListaClientes(List<Cliente> listaClientes) {
		this.listaClientes = listaClientes;
	}

	public Cliente getClienteSelecionado() {
		return clienteSelecionado;
	}

	public void setClienteSelecionado(Cliente clienteSelecionado) {
		this.clienteSelecionado = clienteSelecionado;
	}
	
}

Então para usar basta definir ele como sendo o converter e colocar explicitamente um atributo chamado 'items' na tag selectOneMenu como abaixo.

<p:selectOneMenu id="combo" value="#{clienteMB.clienteSelecionado}" 
                           converter="selectOneUsingObjectConverter" items="#{clienteMB.listaClientes}">  
        <f:selectItem itemLabel="Selecione" itemValue="" />  
        <f:selectItems value="#{clienteMB.listaClientes}" var="cliente" itemLabel="#{cliente.nome}" itemValue="#{cliente}" />  
</p:selectOneMenu>

Pronto, nossa combo do JSF ta funcionando belezinha.

É isso ai, qualquer coisa posta ae.

Victor Lindberg

Boa !! Galera

eu estou com um erro nesta linha:

<p:selectOneMenu id="combo" value="#{cidadeBean.estadoSelecionado}"   
                    converter="selectOneUsingObjectConverter" [b]items="#{cidadeBean.listaEstados}">  [/b] O atributo items não esta definido na interface do componente
                <f:selectItem itemLabel="Selecione" itemValue="" />    
                <f:selectItems value="#{cidadeBean.listaEstados}" var="estado" itemLabel="#{estado.nomeEstado}" itemValue="#{estado}" />    
            </p:selectOneMenu>

o que será que estou errando, estou usando o prime em outras partes e nao há erros, somente nesse "items".

Obrigadoo.

L

Qual o erro que esta ocorrendo?

Coloque o stacktrace e detalhe mais o problema para que possamos tentar ajudar.

H

Boa Galera, segue o stack trace.

java.lang.RuntimeException: Não foi possível obter a propriedade 'id' do item
	at br.com.webgi.componentes.SelectOneUsingObjectConverter.getIdByReflection(SelectOneUsingObjectConverter.java:60)
	at br.com.webgi.componentes.SelectOneUsingObjectConverter.getAsString(SelectOneUsingObjectConverter.java:41)
	at org.primefaces.renderkit.InputRenderer.getOptionAsString(InputRenderer.java:140)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeOption(SelectOneMenuRenderer.java:245)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeSelectItems(SelectOneMenuRenderer.java:239)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeInput(SelectOneMenuRenderer.java:88)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeMarkup(SelectOneMenuRenderer.java:65)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeEnd(SelectOneMenuRenderer.java:41)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
	at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
	at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NoSuchFieldException: id
	at java.lang.Class.getDeclaredField(Class.java:1882)
	at br.com.webgi.componentes.SelectOneUsingObjectConverter.getIdByReflection(SelectOneUsingObjectConverter.java:56)
	... 40 more

Então erro esta na minha pagina xhtml, no codigo do SelectOneMenu:

converter="selectOneUsingObjectConverter" items="#{cidadeBean.listaEstados}">

O atributo items não esta definido na interface do componente.

Obrigado pela força, to levando um baile de selectonemenu, me ajudem!!

L

henrique ganso:
Boa Galera, segue o stack trace.

java.lang.RuntimeException: Não foi possível obter a propriedade 'id' do item
	at br.com.webgi.componentes.SelectOneUsingObjectConverter.getIdByReflection(SelectOneUsingObjectConverter.java:60)
	at br.com.webgi.componentes.SelectOneUsingObjectConverter.getAsString(SelectOneUsingObjectConverter.java:41)
	at org.primefaces.renderkit.InputRenderer.getOptionAsString(InputRenderer.java:140)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeOption(SelectOneMenuRenderer.java:245)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeSelectItems(SelectOneMenuRenderer.java:239)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeInput(SelectOneMenuRenderer.java:88)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeMarkup(SelectOneMenuRenderer.java:65)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeEnd(SelectOneMenuRenderer.java:41)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
	at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
	at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NoSuchFieldException: id
	at java.lang.Class.getDeclaredField(Class.java:1882)
	at br.com.webgi.componentes.SelectOneUsingObjectConverter.getIdByReflection(SelectOneUsingObjectConverter.java:56)
	... 40 more

Então erro esta na minha pagina xhtml, no codigo do SelectOneMenu:

converter="selectOneUsingObjectConverter" items="#{cidadeBean.listaEstados}">

O atributo items não esta definido na interface do componente.

Obrigado pela força, to levando um baile de selectonemenu, me ajudem!!

Cara, isso ta acontecendo pq sua classe de estados nao tem a propriedade id. O converter tenta pegar a propriedade id para identificar o item selecionado. Verifique se sua classe de estado tem a propriedade id e se tem os sets e gets.

Cole aqui sua classe de estado.

H

Boa Noite,
Retirei a herança que eu tinha no “id” das minhas entidades, segue minha classe estado e o stacktrace que esta gerando agora.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.webgi.entidade;


import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 *
 * @author Dom
 */
@Entity
public class Estado implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)

     private Long id;
     private String nomeEstado;
     private String siglaEstado;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNomeEstado() {
        return nomeEstado;
    }

    public void setNomeEstado(String nomeEstado) {
        this.nomeEstado = nomeEstado;
    }

    public String getSiglaEstado() {
        return siglaEstado;
    }

    public void setSiglaEstado(String siglaEstado) {
        this.siglaEstado = siglaEstado;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Estado other = (Estado) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if ((this.nomeEstado == null) ? (other.nomeEstado != null) : !this.nomeEstado.equals(other.nomeEstado)) {
            return false;
        }
        if ((this.siglaEstado == null) ? (other.siglaEstado != null) : !this.siglaEstado.equals(other.siglaEstado)) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 37 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 37 * hash + (this.nomeEstado != null ? this.nomeEstado.hashCode() : 0);
        hash = 37 * hash + (this.siglaEstado != null ? this.siglaEstado.hashCode() : 0);
        return hash;
    }

    @Override
    public String toString() {
        return "Estado{" + "id=" + id + ", nomeEstado=" + nomeEstado + ", siglaEstado=" + siglaEstado + '}';
    }
   
}

Não foi possível obter a propriedade ‘id’ do item
StackTrace

java.lang.RuntimeException: Não foi possível obter a propriedade 'id' do item
	at br.com.webgi.componentes.SelectOneUsingObjectConverter.getIdByReflection(SelectOneUsingObjectConverter.java:60)
	at br.com.webgi.componentes.SelectOneUsingObjectConverter.getAsString(SelectOneUsingObjectConverter.java:41)
	at org.primefaces.renderkit.InputRenderer.getOptionAsString(InputRenderer.java:140)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeOption(SelectOneMenuRenderer.java:245)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeSelectItems(SelectOneMenuRenderer.java:239)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeInput(SelectOneMenuRenderer.java:88)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeMarkup(SelectOneMenuRenderer.java:65)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeEnd(SelectOneMenuRenderer.java:41)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
	at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
	at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NoSuchFieldException: id
	at java.lang.Class.getDeclaredField(Class.java:1882)
	at br.com.webgi.componentes.SelectOneUsingObjectConverter.getIdByReflection(SelectOneUsingObjectConverter.java:56)
	... 40 more

Cadastro de Cidades

<?xml version="1.0" encoding="ISO-8859-1" ?>  
<f:view  xmlns:f="http://java.sun.com/jsf/core">
    
 <html xmlns="http://www.w3.org/1999/xhtml"
       xmlns:h="http://java.sun.com/jsf/html"
       xmlns:f="http://java.sun.com/jsf/core"
       xmlns:ui="http://java.sun.com/jsf/facelets"
       xmlns:p="http://primefaces.org/ui">
       <ui:composition template="/templates/plataforma.xhtml">
   
       <title>WebGI - INSJC</title>
       <ui:define name="titulo">
        Cadastro de Cidades
       </ui:define>
       <ui:define name="corpo">
         <h1>Cadastro de Cidades</h1>
         <hr />
         <h:form>
            <h:messages />
            <h:panelGrid columns="2">
                <h:outputLabel value="Cidade:" for="cidade" />
                <p:inputText id="cidade" label="cidade" value="#{cidadeBean.cidade.nomeCidade}" required="true" />
                <h:outputLabel value="Estado:" for="estado" />

                <p:selectOneMenu id="combo" value="#{cidadeBean.estadoSelecionado}"     
                        converter="selectOneUsingObjectConverter" items="#{cidadeBean.listaEstados}">    
                    <f:selectItem itemLabel="Selecione" itemValue="" />      
                    <f:selectItems value="#{cidadeBean.listaEstados}" var="estado" itemLabel="#{estado.nomeEstado}" itemValue="#{estado}" />      
                </p:selectOneMenu>                                                 
                <h:outputText />
            </h:panelGrid>
            <hr/>
            <h:panelGrid columns="4">                
                <p:growl id="avisos" showDetail="true" life="3000" />
                <h:commandButton action="#{cidadeBean.insere}" value="Salvar" />         
                <hr/>
            </h:panelGrid>
            <h1>Cidades Cadastradas</h1>    

     
         </h:form>
         <p:messages id="mensagens" showDetail="true" />
         <hr />   
       </ui:define>
      </ui:composition>
 </html>
</f:view>

Cidade Bean

package br.com.webgi.bean;

import br.com.webgi.DAO.DAOGenerico;
import javax.faces.bean.*;
import br.com.webgi.entidade.Cidade;
import br.com.webgi.entidade.Estado;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;

@ManagedBean(name="cidadeBean")
@RequestScoped

public class cidadeBean {
    Cidade cidade = new Cidade();
    Estado estado = new Estado();

    
    public String insere()
       {
                   
                    DAOGenerico obj_cidadeDAO = new DAOGenerico(cidade);
                    obj_cidadeDAO.insere();
                    
                    return "cadastrado";
       }

    public Cidade getCidade() {
        return cidade;
    }

    public void setCidade(Cidade cidade) {
        this.cidade = cidade;
    }

    private List<Estado> listaEstados;  
  
    private Estado estadoSelecionado;  
  
  
  
    public void setListaEstados(List<Estado> listaEstados) {  
        this.listaEstados = listaEstados;  
    }  
  
    public Estado getEstadoSelecionado() {  
        return estadoSelecionado;  
    }  
  
    public void setEstadoSelecionado(Estado estadoSelecionado) {  
        this.estadoSelecionado = estadoSelecionado;  
    }  

    public List<SelectItem> getListaEstados() {
        DAOGenerico obj_estadoDAO = new DAOGenerico(estado);
        ArrayList<SelectItem> listaEstados = new ArrayList<SelectItem>();
        List<Estado> resultado = obj_estadoDAO.find();
        for (Estado e : resultado)
            listaEstados.add(new SelectItem(e.getId(), e.getNomeEstado()));
        return listaEstados;
    }
    
 
}

Obrigado a força, sou novo em web o baile ta bonito !!

L

henrique ganso:
Boa Noite,
Retirei a herança que eu tinha no “id” das minhas entidades, segue minha classe estado e o stacktrace que esta gerando agora.

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.webgi.entidade;


import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

/**
 *
 * @author Dom
 */
@Entity
public class Estado implements Serializable {

    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)

     private Long id;
     private String nomeEstado;
     private String siglaEstado;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNomeEstado() {
        return nomeEstado;
    }

    public void setNomeEstado(String nomeEstado) {
        this.nomeEstado = nomeEstado;
    }

    public String getSiglaEstado() {
        return siglaEstado;
    }

    public void setSiglaEstado(String siglaEstado) {
        this.siglaEstado = siglaEstado;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Estado other = (Estado) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if ((this.nomeEstado == null) ? (other.nomeEstado != null) : !this.nomeEstado.equals(other.nomeEstado)) {
            return false;
        }
        if ((this.siglaEstado == null) ? (other.siglaEstado != null) : !this.siglaEstado.equals(other.siglaEstado)) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 37 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 37 * hash + (this.nomeEstado != null ? this.nomeEstado.hashCode() : 0);
        hash = 37 * hash + (this.siglaEstado != null ? this.siglaEstado.hashCode() : 0);
        return hash;
    }

    @Override
    public String toString() {
        return "Estado{" + "id=" + id + ", nomeEstado=" + nomeEstado + ", siglaEstado=" + siglaEstado + '}';
    }
   
}

Não foi possível obter a propriedade ‘id’ do item
StackTrace

java.lang.RuntimeException: Não foi possível obter a propriedade 'id' do item
	at br.com.webgi.componentes.SelectOneUsingObjectConverter.getIdByReflection(SelectOneUsingObjectConverter.java:60)
	at br.com.webgi.componentes.SelectOneUsingObjectConverter.getAsString(SelectOneUsingObjectConverter.java:41)
	at org.primefaces.renderkit.InputRenderer.getOptionAsString(InputRenderer.java:140)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeOption(SelectOneMenuRenderer.java:245)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeSelectItems(SelectOneMenuRenderer.java:239)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeInput(SelectOneMenuRenderer.java:88)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeMarkup(SelectOneMenuRenderer.java:65)
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeEnd(SelectOneMenuRenderer.java:41)
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875)
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312)
	at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185)
	at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168)
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1757)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1760)
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:402)
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131)
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
	at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
	at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.NoSuchFieldException: id
	at java.lang.Class.getDeclaredField(Class.java:1882)
	at br.com.webgi.componentes.SelectOneUsingObjectConverter.getIdByReflection(SelectOneUsingObjectConverter.java:56)
	... 40 more

Cadastro de Cidades

<?xml version="1.0" encoding="ISO-8859-1" ?>  
<f:view  xmlns:f="http://java.sun.com/jsf/core">
    
 <html xmlns="http://www.w3.org/1999/xhtml"
       xmlns:h="http://java.sun.com/jsf/html"
       xmlns:f="http://java.sun.com/jsf/core"
       xmlns:ui="http://java.sun.com/jsf/facelets"
       xmlns:p="http://primefaces.org/ui">
       <ui:composition template="/templates/plataforma.xhtml">
   
       <title>WebGI - INSJC</title>
       <ui:define name="titulo">
        Cadastro de Cidades
       </ui:define>
       <ui:define name="corpo">
         <h1>Cadastro de Cidades</h1>
         <hr />
         <h:form>
            <h:messages />
            <h:panelGrid columns="2">
                <h:outputLabel value="Cidade:" for="cidade" />
                <p:inputText id="cidade" label="cidade" value="#{cidadeBean.cidade.nomeCidade}" required="true" />
                <h:outputLabel value="Estado:" for="estado" />

                <p:selectOneMenu id="combo" value="#{cidadeBean.estadoSelecionado}"     
                        converter="selectOneUsingObjectConverter" items="#{cidadeBean.listaEstados}">    
                    <f:selectItem itemLabel="Selecione" itemValue="" />      
                    <f:selectItems value="#{cidadeBean.listaEstados}" var="estado" itemLabel="#{estado.nomeEstado}" itemValue="#{estado}" />      
                </p:selectOneMenu>                                                 
                <h:outputText />
            </h:panelGrid>
            <hr/>
            <h:panelGrid columns="4">                
                <p:growl id="avisos" showDetail="true" life="3000" />
                <h:commandButton action="#{cidadeBean.insere}" value="Salvar" />         
                <hr/>
            </h:panelGrid>
            <h1>Cidades Cadastradas</h1>    

     
         </h:form>
         <p:messages id="mensagens" showDetail="true" />
         <hr />   
       </ui:define>
      </ui:composition>
 </html>
</f:view>

Cidade Bean

package br.com.webgi.bean;

import br.com.webgi.DAO.DAOGenerico;
import javax.faces.bean.*;
import br.com.webgi.entidade.Cidade;
import br.com.webgi.entidade.Estado;
import java.util.ArrayList;
import java.util.List;
import javax.faces.model.SelectItem;

@ManagedBean(name="cidadeBean")
@RequestScoped

public class cidadeBean {
    Cidade cidade = new Cidade();
    Estado estado = new Estado();

    
    public String insere()
       {
                   
                    DAOGenerico obj_cidadeDAO = new DAOGenerico(cidade);
                    obj_cidadeDAO.insere();
                    
                    return "cadastrado";
       }

    public Cidade getCidade() {
        return cidade;
    }

    public void setCidade(Cidade cidade) {
        this.cidade = cidade;
    }

    private List<Estado> listaEstados;  
  
    private Estado estadoSelecionado;  
  
  
  
    public void setListaEstados(List<Estado> listaEstados) {  
        this.listaEstados = listaEstados;  
    }  
  
    public Estado getEstadoSelecionado() {  
        return estadoSelecionado;  
    }  
  
    public void setEstadoSelecionado(Estado estadoSelecionado) {  
        this.estadoSelecionado = estadoSelecionado;  
    }  

    public List<SelectItem> getListaEstados() {
        DAOGenerico obj_estadoDAO = new DAOGenerico(estado);
        ArrayList<SelectItem> listaEstados = new ArrayList<SelectItem>();
        List<Estado> resultado = obj_estadoDAO.find();
        for (Estado e : resultado)
            listaEstados.add(new SelectItem(e.getId(), e.getNomeEstado()));
        return listaEstados;
    }
    
 
}

Obrigado a força, sou novo em web o baile ta bonito !!

O problema está ocorrendo pq vc ta retornando a lista de estados no seu método getListaEstados no managedbean como sendo uma lista de SelectItem. Então o converter SelectOneUsingObjectConverter vai tentar pegar a propriedade id de cada item, como vc ta usando SelectItem, ele não encontra a propriedade id, pois SelectItem não tem uma propriedade id. Se você observar o exemplo de uso que coloquei no inicio do post, veja no método do meu managedbean que retorna os items. Eu uso uma lista do proprio objeto e nao de selectitem. Você nao precisa e nem é pra usar SelectItem. Devolva simplesmente a lista de estados e o converter vai fazer o “meio de campo” pra vc. Então mude o seu método getListaEstados para como abaixo:

public List<Estado> getListaEstados() { DAOGenerico obj_estadoDAO = new DAOGenerico(estado); return obj_estadoDAO.find(); }

O correto é você devolver a lista de objetos Estado e não de SelectItem. Por você estar devolvendo SelectItem e não estado é que o converter tava tentando pegar ‘id’ e não tava encontrando. Agora devolvendo ‘estado’ o converter vai encontrar sem problemas a propriedade id.

Espero que tenha resolvido seu problema.

Abraço.

H

Boa Noite,

Então realizei as correções, agora quando salvo uma cidade o sistema esta salvando apenas o nome da cidade na tabela cidade, o estado não. O que será que pode ser?

P

Amigos… estou tentando a dias já fazer uma consulta, pegando como parametro um item de um combobox… porém, sem sucesso!
Rodando o debug, percebi que não estava conseguindo pegar o item do combobox, sempre chegava nulo… pesquisando um pouco encontrei este post…

tentei seguir a solução que lindberg713 apresentou, porém está dando erro java.lang.NullPointerException ao renderizar a tela, na linha

@Override  
public String getAsString(FacesContext context, UIComponent component, Object value) {  
      if (value == null)  
          return "";  
         
      //AQUIII
     return getIdByReflection(value).toString();  
}

não tenho muita experiencia ainda com JavaWeb… e nao estou conseguindo “enxergar” qual é o erro que estou cometendo… se alguem puder me dar uma força, agradeço desde já!

O converter, a unica coisa que mudei foi o atributo “id” para “id_datasetini”, e o tipo Long para Integer…

@FacesConverter("diretorioConverter")  
public class DiretorioConverter implements Converter{  
      
    @Override  
    public Object getAsObject(FacesContext context, UIComponent component, String value) {  
        if (value == null || value.equals(""))  
            return null;  
  
        try{  
            Integer id = Integer.valueOf(value);  
            Collection items =  (Collection) component.getAttributes().get("items");  
            return findById(items, id);  
        }catch(Exception ex){  
            throw new ConverterException("Não foi possível aplicar conversão de item com valor ["+value+"] no componente ["+component.getId()+"]", ex);  
        }  
    }  
      
    @Override  
    public String getAsString(FacesContext context, UIComponent component, Object value) {  
        if (value == null)  
            return "";  
          
        return getIdByReflection(value).toString();  
    }  
      
    private Object findById(Collection collection, Integer idToFind){  
        for (Object obj : collection){  
             Integer id = getIdByReflection(obj);  
             if (id == idToFind)  
                 return obj;  
        }  
          
        return null;  
    }  
      
    private Integer getIdByReflection(Object bean){  
        try{  
            Field idField = bean.getClass().getDeclaredField("id_datasetini");  
            idField.setAccessible(true);  
            return (Integer) idField.get(bean);  
        }catch(Exception ex){  
            throw new RuntimeException("Não foi possível obter a propriedade 'id' do item",ex);  
        }  
    }  
  
}

O erro

21:52:59,346 Grave [javax.enterprise.resource.webcontainer.jsf.application] (http-localhost-127.0.0.1-9090-1) Error Rendering View[/astronomia/consulta.xhtml]: java.lang.NullPointerException
	at astronomia.converter.DiretorioConverter.getAsString(DiretorioConverter.java:61) [classes:]
	at org.primefaces.util.ComponentUtils.getValueToRender(ComponentUtils.java:74) [primefaces-3.2.jar:]
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeLabel(SelectOneMenuRenderer.java:120) [primefaces-3.2.jar:]
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeMarkup(SelectOneMenuRenderer.java:89) [primefaces-3.2.jar:]
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeEnd(SelectOneMenuRenderer.java:62) [primefaces-3.2.jar:]
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:57) [primefaces-3.2.jar:]
	at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:45) [primefaces-3.2.jar:]
	at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:185) [primefaces-3.2.jar:]
	at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:108) [primefaces-3.2.jar:]
	at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:55) [primefaces-3.2.jar:]
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1763) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1756) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) [primefaces-3.2.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:139) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final]
	at org.jboss.as.web.NamingValve.invoke(NamingValve.java:57) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final]
	at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:49) [jboss-as-jpa-7.0.2.Final.jar:7.0.2.Final]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:154) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:667) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:952) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at java.lang.Thread.run(Thread.java:722) [:1.7.0_02]

21:52:59,354 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[default-host].[/Astrono].[Faces Servlet]] (http-localhost-127.0.0.1-9090-1) Servlet.service() for servlet Faces Servlet threw exception: java.lang.NullPointerException
	at astronomia.converter.DiretorioConverter.getAsString(DiretorioConverter.java:61) [classes:]
	at org.primefaces.util.ComponentUtils.getValueToRender(ComponentUtils.java:74) [primefaces-3.2.jar:]
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeLabel(SelectOneMenuRenderer.java:120) [primefaces-3.2.jar:]
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeMarkup(SelectOneMenuRenderer.java:89) [primefaces-3.2.jar:]
	at org.primefaces.component.selectonemenu.SelectOneMenuRenderer.encodeEnd(SelectOneMenuRenderer.java:62) [primefaces-3.2.jar:]
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at com.sun.faces.renderkit.html_basic.HtmlBasicRenderer.encodeRecursive(HtmlBasicRenderer.java:312) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at com.sun.faces.renderkit.html_basic.GridRenderer.renderRow(GridRenderer.java:185) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at com.sun.faces.renderkit.html_basic.GridRenderer.encodeChildren(GridRenderer.java:129) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at org.primefaces.renderkit.CoreRenderer.renderChild(CoreRenderer.java:57) [primefaces-3.2.jar:]
	at org.primefaces.renderkit.CoreRenderer.renderChildren(CoreRenderer.java:45) [primefaces-3.2.jar:]
	at org.primefaces.component.panel.PanelRenderer.encodeContent(PanelRenderer.java:185) [primefaces-3.2.jar:]
	at org.primefaces.component.panel.PanelRenderer.encodeMarkup(PanelRenderer.java:108) [primefaces-3.2.jar:]
	at org.primefaces.component.panel.PanelRenderer.encodeEnd(PanelRenderer.java:55) [primefaces-3.2.jar:]
	at javax.faces.component.UIComponentBase.encodeEnd(UIComponentBase.java:875) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1763) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at javax.faces.render.Renderer.encodeChildren(Renderer.java:168) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:845) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1756) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at javax.faces.component.UIComponent.encodeAll(UIComponent.java:1759) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at com.sun.faces.application.view.FaceletViewHandlingStrategy.renderView(FaceletViewHandlingStrategy.java:401) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at com.sun.faces.application.view.MultiViewHandler.renderView(MultiViewHandler.java:131) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:121) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) [jsf-impl-2.1.3-b02-jbossorg-2.jar:2.1.3-SNAPSHOT]
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:594) [jboss-jsf-api_2.1_spec-2.0.0.Beta1.jar:2.0.0.Beta1]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) [primefaces-3.2.jar:]
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:139) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final]
	at org.jboss.as.web.NamingValve.invoke(NamingValve.java:57) [jboss-as-web-7.0.2.Final.jar:7.0.2.Final]
	at org.jboss.as.jpa.interceptor.WebNonTxEmCloserValve.invoke(WebNonTxEmCloserValve.java:49) [jboss-as-jpa-7.0.2.Final.jar:7.0.2.Final]
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:154) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:362) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:667) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:952) [jbossweb-7.0.1.Final.jar:7.0.2.Final]
	at java.lang.Thread.run(Thread.java:722) [:1.7.0_02]

Obrigado desde já!!

T

Estou com o mesmo problema…

Nova Requisição
</ui:define>
	<ui:define name="corpo">
		<h:form id="cadastro">
			<h:messages />
			<br/>	
				<fieldset><legend>Requisição</legend>
				<h:panelGrid columns="3">
				<h:outputText value="Item:"/>  
        		<h:selectOneMenu id="itemSelecionado" value="#{carrinhoBean.produtoSelecionado}" converter="itemConverter" items="#{itemBean.itens}">
 				<f:selectItem itemLabel="Selecione" itemValue=""/>  
 				<f:selectItems 
 					value="#{itemBean.itens}"
 					var ="itens"
					itemValue="#{itens}"
					itemLabel="#{itens.nome}"/>
				</h:selectOneMenu>
@FacesConverter(value = "itemConverter")

public class ItemConverter implements Converter {

	  @Override  
	    public Object getAsObject(FacesContext context,  
	        UIComponent component, String value) {  
	        if (value == null || value.equals(""))  
	            return null;  
	  
	        try{  
	            Long id = Long.valueOf(value);  
	            Collection items =  (Collection) component.getAttributes().get("items");  
	            return findById(items, id);  
	        }catch(Exception ex){  
	            throw new ConverterException("Não foi possível aplicar conversão de item com valor ["+value+"] no componente ["+component.getId()+"]", ex);  
	        }  
	    }  
	      
	    @Override  
	    public String getAsString(FacesContext context, UIComponent component,  
	            Object value) {  
	        if (value == null)  
	            return "";  
	          
	        return getIdByReflection(value).toString();  
	    }  
	      
	    private Object findById(Collection collection, Long idToFind){  
	        for (Object obj : collection){  
	             Long id = getIdByReflection(obj);  
	             if (id == idToFind)  
	                 return obj;  
	        }  
	          
	        return null;  
	    }  
	      
	    private Long getIdByReflection(Object bean){  
	        try{  
	            Field idField = bean.getClass().getDeclaredField("id");  
	            idField.setAccessible(true);  
	            return (Long) idField.get(bean);  
	        }catch(Exception ex){  
	            throw new RuntimeException("Não foi possível obter a propriedade 'id' do item",ex);  
	        }  
	    }  
	  
	}
@Entity  
public class Produto implements   Serializable{
	
	private static final long serialVersionUID = -2477528265610024554L;
	@Id  
    @GeneratedValue(strategy= GenerationType.AUTO)
	
	private Long id;  
	public Item objetoItem;	
	public int quantidadeItem;
	
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	public Item getObjetoItem() {
		return objetoItem;
	}
	public void setObjetoItem(Item objetoItem) {
		this.objetoItem = objetoItem;
	}
	public int getQuantidadeItem() {
		return quantidadeItem;
	}
	public void setQuantidadeItem(int quantidadeItem) {
		this.quantidadeItem = quantidadeItem;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		result = prime * result
				+ ((objetoItem == null) ? 0 : objetoItem.hashCode());
		result = prime * result + quantidadeItem;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Produto other = (Produto) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		if (objetoItem == null) {
			if (other.objetoItem != null)
				return false;
		} else if (!objetoItem.equals(other.objetoItem))
			return false;
		if (quantidadeItem != other.quantidadeItem)
			return false;
		return true;
	}
    
	
	
	
}
public class CarrinhoBean {
	
	
	private Produto produto = new Produto();
	ItemBean itemBean = new ItemBean();	
	
	private String car;
	private Produto produtoSelecionado;
	
	public List<Produto> lista = new ArrayList<Produto>();  
	public ArrayList<String> carrinhoSessao = new ArrayList<String>();

	
    public String insere() {  
    	Produto produto = new Produto();
    	produto.setObjetoItem(getProduto().getObjetoItem());
    	produto.setQuantidadeItem(getProduto().getQuantidadeItem());
    	
    	lista.add(produto);
		return null;
	 }  
    
  
    public String remove(Produto produto) {  
    	
    	lista.remove(produto);
    	return null;  
    }
    
    public List<Produto> getLista() {
	  return lista;
    }
    	 
	public Produto getProduto() {
		return produto;
	}

	public void setProduto(Produto produto) {
		this.produto = produto;
	}

	public Produto getProdutoSelecionado() {
		return produtoSelecionado;
	}

	public void setProdutoSelecionado(Produto produtoSelecionado) {
		this.produtoSelecionado = produtoSelecionado;
	}

}

O q fiz de errado ?

Abracos

P

Olá amigo, tenta essa solução que depois de um tempo apanhando consegui fazer. Funciona certinho e é bem mais simples do que imagina :wink:

http://www.guj.com.br/java/279916-resolvido-pegar-item-de-um-componente-combobox-listbox-e-usar-como-parametro-para-consulta/2#1478743

Abraços.

C

Ola lindberg713 , onde é que eu devo colocar este atributo id?

Criado 3 de novembro de 2011
Ultima resposta 19 de jul. de 2013
Respostas 34
Participantes 12