[JSF] Campos readonly perdem valor ao ocorrerem erros de validacao

Senhores,

Quando realizo um submit de uma pagina na qual existe algum erro de validacao JSF todos os campos readonly perdem o valor informado.

O mesmo nao ocorre caso a pagina jah tenha sido carregada com esses valores.

Eu nao sei se isso eh algum problema de configuracao ou se eh o comportamento do JSF.

Alguem jah passou por essa situacao?
Como posso resolver este problema?

Grato,
Marcel.

Poderia explicar melhor, sou expert nos bugs do JSF!!!

Pelo que entendi, vc ta perdendo o valores de um campo readonly. Tudo bem. Se o campo é readonly, como vc conseguiu inserir o valor?

O outro caso faz sentido, seu mgrBean está populando as informações hardcode!!!

Cara, se o campo não for readonly e vc setou e valor na página e processou com um CommandLink ou CommandButton, verifique se o immediate está setado com true.

O campo read-only eh populado atraves de uma LOV (list of values).

Por exemplo: existe um cadastro de cidades onde sao informados o codigo e o nome da cidade. Existe tambem um cadastro de colaboradores onde eh preciso informar a cidade de nascimento do colaborador. Este cadastro tem dois campos com informacoes referentes a cidade. Um editavel destinado ao codigo e outro, readonly, destinado ao nome.

A cidade pode ser informada de duas formas. Uma delas eh digitar diretamente o codigo da cidade, neste caso o nome sera preenchido no campo readoly via DWR. Outra forma seria abrir a LOV e encontrar a cidade desejada na lista, entao ao clicar sobre o registro da cidade desejada os valores do codigo e nome seriam setados para os respectivos campos via javascript.

Os cadastros estao funcionando corretamente conforme o cenario descrito acima. Porem no backing bean os campos readonly possuem valor null e não o valor da tela.

O CommandButton nao eh immediate nao.

Senhores,

Deixo aqui registrado para a posteridade o que encontrei sobre o problema descrito e a solucao adotada. Pelo que encontrei na net, JSF realmente nao recupera do lado do server os valores de campos disabled (ateh ai tudo bem pq eh o comportamento html padrao) e nem readonly (ai eh que ferrou a nossa vida):
“…for security considerations, the JSF engine doesn’t take over disabled
or readOnly attributes to the server, it was a bug that we did…”
(http://mail-archives.apache.org/mod_mbox/myfaces-users/200603.mbox/<SAAB5kXNMLyaZkP76jb000009af@saab.corp.muranosoft.com>)

Pra mim o bug esta no que eles julgam ser a correcao do mesmo, mas fazer o que…

Uma possivel solucao sugerida no forum da Sun seria incluir um campo hidden para passar o valor ao server enquanto que o readonly seria apenas para exibicao.
(http://forum.java.sun.com/thread.jspa?threadID=601263&messageID=4096722 e http://forum.java.sun.com/thread.jspa?threadID=706342&tstart=60).
Eu nao gosto desta abordagem porque eu teria que duplicar os sets e cleans dos campos readonly (um para o proprio campo e outro para o hidden).

Outra coisa que descobri eh que caso o campo nao seja readonly e depois o mesmo seja modificado para reaonly via javascript seus valores sao recuperados pelo servidor. Espero que nao descubram esse “bug” pois foi com base nele que solucionei o problema.

Como a solucao sugerida no forum da Sun jah eh Pog resolvi adotar outro mais pratico, criei a funcao javascript abaixo e adicionei ao body de todas as minhas telas o onload=“javascript:setReadonly()”.

function setReadonly() { for (i=0; i<document.forms.length; i++) { for (j=0; j<document.forms[i].elements.length; j++) { // "input-readonly" eh o estilo css utilizados em todos os campos read-only if (document.forms[i].elements[j].className == 'input-readonly') { document.forms[i].elements[j].readOnly = true; } } } }

Abraco,
Marcel.