JSF + Ajax - h:selectOneMenu - Value is not valid

Tenho 2 h:selectOneMenu Dependentes.

O primeiro deles trago o valor do banco por um Bean.
O segundo trago o valor dependente do valor escolhido no primeiro.

Até ai tudo bem, mil maravilhas exibindo na tela e tudo mais.

O problema é quando envio essa informação, o segundo h:selectOneMenu
foi populado ou reescrito pelo JavaScript que escrevi na mão.

Os valores estão corretos tanto o value com o label, mais o JSF dispara:

sourceId=j_id15:razaoSocial[severity=(ERROR 2), summary=(: Validation Error: Value is not valid), detail=(: Validation Error: Value is not valid)]

Estou a 2 dias quebrando a cabeça, já mandaram sobreescrever HashCode, Equals e toString, já fiz tudo isso e nada.
Porque não estou escrevendo o valor desse selectOneMenu por nenhum backbean e sim pelo javascript.

Alguém tem alguma solução?

qual o valor que está sendo passado no segundo selectOneMenu, tem value e label, o value tem que ser object…

value="${Vendedor.id}"
e label="${Vendedor.nome}"

id é int
nome é String

Mais na verdade é um javascript q está populando ele no evento onChange do anterior

[quote=Gbzao!]value="${Vendedor.id}"
e label="${Vendedor.nome}"

id é int
nome é String

Mais na verdade é um javascript q está populando ele no evento onChange do anterior[/quote]

qual versão do java vc utiliza…

posta ai o código do select…

Java 1.6
JSF 1.2 + Facelets

Primeiro Select que está perfeito

								<select jsfc="h:selectOneMenu" value="${ClientePedido.id}"
									onchange="Dados2(this.value)" label="${ClientePedido.nome}"
									id="vendedor" name="vendedor"
									style="margin-right: 20px; text-align: left;">
									<option jsfc="f:selectItem" itemValue=""
										itemLabel="**** Selecione um Vendedor ****"></option>
									<c:forEach var="c" items="${login.todosVendedores}">
										<option jsfc="f:selectItem" itemValue="${c.id}"
											itemLabel="${c.nome}"></option>
									</c:forEach>
								</select>

Segundo Select que Renderiza na tela perfeito, mais após postar o JSF dá o VALUE IS NOT VALID

	<select jsfc="h:selectOneMenu" value="${Vendedor.id}"
									onchange="doCfop(this.value)" label="${Vendedor.nome}"
									id="razaoSocial" name="razaoSocial" 
									style="margin: 12px 20px 0 0; text-align: left;">
									<option jsfc="f:selectItem" itemValue="1" 
										itemLabel="--Primeiro Selecione um Vendedor--"></option>
								</select>

Bem, antes de mais nada, para entender o problema você pode ler aqui,
http://www.rponte.com.br/2008/02/01/selectonemenu-converter-erro-de-validacao/

Lendo o que você disse:

Você pode fazer tudo no cliente (browser) através de javascript, mas isso não diz nada ao JSF já que você não está alterando o estado dos componentes na árvore (UIViewRoot), isto é, o estado dos componentes está no servidor.

Vamos para um exemplo prático:
Se você entra numa página onde um h:inputText é gerado como readonly=“true”, mesmo que você via javascript mude para readonly=“false”, ao submeter o formulário o JSF irá garantir que este componente (h:inputText) não será alterado pois o componente continua com o mesmo estado no servidor, isto é, readonly=“true”.

Deu para entender?

Neste teu caso é aconselhado você utilizar o Richfaces/Ajax4jsf, pois assim ele efetuará uma requisição ao servidor e alterará o estado do componente no servidor.

Abraços e boa sorte.

Rafael,

Pesquisei horas e horas no Google e já li esse texto do seu Blog umas 50 vezes hehe.
No backbean tentei sobreescrever Equals(), HashCode() e toString()

Mais acho que o que fiz está um pouco diferente né, pq os dados vem exclusivamente do JavaScript
e o JSF não está conseguindo lê-los.

Não existe solução a não ser usar RichFaces?

Não tem como eu implementar um Conversor que lê os dados que o JavaScript trouxe ou pelo menos
o que eu postei?

[quote] Pesquisei horas e horas no Google e já li esse texto do seu Blog umas 50 vezes hehe.
No backbean tentei sobreescrever Equals(), HashCode() e toString() [/quote]
rss… legal :lol: Mas o problema que está ocorrendo do “is not valid” é explicado no post, como você monta o componente sem nenhum valor (f:selectItem) o JSF não aceita teu valor como válido, logo ocorre o erro de validação. Isso tem a ver com segurança.

[quote] Mais acho que o que fiz está um pouco diferente né, pq os dados vem exclusivamente do JavaScript
e o JSF não está conseguindo lê-los. [/quote]
Exatamente! Como você está gerando as opções através de javascript, ou seja, no cliente, o estado do componente (h:selectOneMenu) no servidor continua como se não houvesse nenhum f:selectItem associado ao componente.

Sim, existem várias. Como utilizar Trinidad ou Myfaces Sandbox ou IceFaces ou DWR ou mesmo outro framework que te permita atualizar o estado do componente no servidor. Mas com certeza hoje em dia o Ajax4jsf é a melhor opção.

[quote]
Não tem como eu implementar um Conversor que lê os dados que o JavaScript trouxe ou pelo menos
o que eu postei?[/quote]
Não, não tem. Não é este o objetivo de um Converter.

Enfim, aconselho-te a aderir ao Ajax4jsf, ele é bem simples e prático. Até a configuração do mesmo é trivial. Vale a pena utiliza-lo.
Abraços e boa sorte.

Muito Obrigado Rafael, esclareceu muito para mim.

Sou desenvolvedor web há alguns anos e há pouco tempo migrei para o Java e conseqüentemente para o JSF.

Estou tomando uma bela surra em tarefas triviais como essa hehe,
definitivamente JSF não é nada produtivo para iniciantes.

Vou implementar então o RichFaces e tentar resolver com Ajax4JSF.

Mais uma vez muito obrigado pela ajuda!

Na verdade não é que JSF não seja produtivo para iniciantes, longe disso :slight_smile: É que a maioria dos desenvolvedores web são acostumados a desenvolver sistemas “action-like”, diferentemente de JSF que se utiliza de “component-like”, difere um pouco, por isso a confusão de inicio, eu passei por isso também logo que comecei com JSF.

As vezes penso que um desenvolvedor Swing que nunca trabalhou com desenvolvimento web tenha uma curva de aprendizagem menor que um desenvolvedor web vindo do Struts, por exemplo. Bem, é o que imagino.

Abraços.