Ajuda JSF - Erro de validação

Pessoal, estou obtendo o seguite erro:

“…Erro de validação “frmTbObjeto:id_objeto”: O valor não é uma opção válida…”

A minha página .jspx

    <h:outputText value="Identificação do Objeto"/>
     <h:selectOneMenu  value="#{ tbObjetoBean.objeto }" >
         <f:selectItem itemValue="" itemLabel="Selecione um Objeto"/> 
         <f:selectItems value="#{ tbObjetoBean.objetosDisponiveis }" />
     </h:selectOneMenu> 

Meu POJO:


@Entity(name="tb_objeto")
public class TbObjeto {

		private String id_objeto;
		private String de_objeto;
	
		
		@Id public String getId_objeto() {
			return id_objeto;
		}

		public void setId_objeto(String id_objeto) {
			this.id_objeto = id_objeto;
		}

               public void setDe_objeto(String de_objeto) {
			this.de_objeto = de_objeto;
		}

		public String getDe_objeto() {
			return de_objeto;
		}
		
		public String toString() {
			return id_objeto;
		}
		
}

E o método do Bean que preeche o SelectMenu

public void carregarObjetosDisponiveis() {
		
		List<TbObjeto> objetos = dao.pesquisar(); // dao é uma instância de TbObjetoDAO
	
		for (TbObjeto o : objetos)
		        objetosDisponiveis.put( o.getDe_objeto(), o.getDe_objeto() );   // comentário 1
		     // objetosDisponiveis.put( o.getId_objeto(), o.getId_objeto() );      // comentário 2
                    

                    // objetosDisponives é uma instância de LinkedHashMap<String, String>...
}

Quando utilizo a linha de “comentário 1”, o programa roda, mas os JSF seta null para a variável id_objeto

Quando utilizo a linha de “comentário 2”, que é a linha que eu preciso que rode, o programa roda, mas exibe a mensagem de erro de validação escrita acima, no início do tópico.

Se alguém puder ajudar,

Fico muito agradecido.

O q vc está tentando fazer e q versão do JSF vc está utilizando?
Posta tb o restante do código do seu ManagedBean q está envolvido nessa operação (atributos) e da entitydade tb.

Estou usando a implementação do Myfaces-1.2.8. Quando eu seleciono um elemento do SelectOneMenu, quero que o atributo itemValue seja setado na variavel objeto do Bean…

Meu Bean

public class TbObjetoBean {

     private Object objeto;
     private  TbObjetoDAO dao;
     private    Map<String, String> objetosDisponiveis; 	
    
       public TbAcaoBean() {
		
                dao = new TbObjetoDAO();
                objetosDisponiveis	= new LinkedHashMap<String, String>();
		carregarObjetosDisponiveis();
		
	}

	public Object getObjeto() {
		return objeto;
	}

	public void setObjeto(Object objeto) {
		this.objeto = objeto;
	}

        public Map<String, String> getObjetosDisponiveis() {
		return objetosDisponiveis;
	}

	public void setObjetosDisponiveis(Map<String, String> objetosDisponiveis) {
		this.objetosDisponiveis = objetosDisponiveis;
	}

        public void carregarObjetosDisponiveis() {
		
		
		List<TbObjeto> objetos = dao.pesquisar();
	
		for (TbObjeto o : objetos)
			objetosDisponiveis.put( o.getDe_objeto(), o.getId_objeto());
		
	}

Como é o html renderizado pelo componente?

O html renderizado pelo componente SelectOneMenu está ok…consigo navegar normalmente pelos elementos atribuídos pelo método carregarObjetosDisponíveis()…Consigo navegar, porém, ao submeter o formulário, dá o erro de validação, e a variável objeto do Bean não é setada…

Vc tem certeza q os ids dos options gerados pelo componente estão corrétos? Se vc está usando String como então deveria funcionar.

Acabei de adicionar um Converter para ver como o JSF estava passando o itemValue do componente para a variável objeto do Bean…

Verifiquei pelo debug que os tipos de dados são compatives…a variávei objeto do Bean é do tipo Object,…e o JSF está passando um tipo String…que é o itemValue do SelectOneMenu…então deveria funcionar…pois uma referência Object pode apontar para uma String, certo?

A princípio isso está corréto, mas como o JSF identifica as propriedade através de reflexão ñ há como ter certeza absoluta sem testar. De qualquer forma o erro q vc descreveu no primeiro post é referente à uma regra de validação do próprio UISelectOne, q diz q uma opção p/ ser válida desse deve pertencer ao grupo de opções disponiveis p/ aquele UISelectOne, ou seja, o valor selecionado só é considerado válido se for um dos SelectItems q alimentam esse UISelectOne. Essa é a razão pela qual todo objeto q venha a ser usado no ItemValue de um SelectItem deve possuir um método equals() pq senão o JSF nunca vai reconhece-lo como uma opção válida. Isso ñ deveria ser um problema com Strings q possuem método equals(). Mas se a renderização estiver com problemas ou se o itemValue ñ for de um tipo q ñ possui um método equals() o erro então estaria encontrado.

1 curtida