“…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.
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());
}
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…
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.