JSF - Problemas na Fase Process validation

8 respostas
D

Pessoal,

Estou com um problema em uma aplicação jsf, acredito que na fase de validação.

Tenho uma tela de cadastro de usuário que possui um botão “Criar Usuário”. Ao clicar neste botão, o formulário é exibido para o preenchimento. Caso ocorra algum erro na validação dos campos, os dados preenchidos sempre serão mantidos no formulário, mesmo quando clico novamente no botão “Criar Usuário”. Já confirmei que este botão sempre executa meu método que instancia um novo usuário, ou seja, mesmo realizando um new Usuario() os dados preenchidos estão sendo carregados após erro na validação.

É possível fazer um reset do ciclo de vida da jsf ao clicar em um botão ou algo do tipo?

Alguém poderia me ajudar?

Obrigado.

8 Respostas

filipenf

você pode colocar esse botão novo usuário num form separado.

D

Já estou utilizando 2 a4j:form. Um para o botão e outro para o formulário.

Obrigado pelo comentário.

gomesrod

Eu não sei se entendi bem o que está acontecendo… você quer que ao clicar em Novo Usuário ele limpe os campos do formulário (mesmo com erros de validação)?
Se for isso, pode tentar colocar o botão Novo Usuário com immediate=true, assim ele pula a etapa de validação.

filipenf

nesse caso ele não deveria nem estar fazendo a validação dos dados do outro formulário.
Só se o a4j tem um comportamento diferente do padrão h:commandButton. Outra alternativa, com a4j seria usar um a4j:region e colocar o botão dentro dessa region.

D

Na verdade não é este o erro do immediate=“true”. Pois como estão em form separados, não há a necessidade do immediate=“true” no botão “Novo Usuário”.

Meu problema é que após um submit e uma validação com erro dos campos, mesmo que eu clique em Novo Usuário um formulário em branco não é carregado. Quando clico no botão Novo Usuário, o formulário é carregado novamente, mas com os campos que eu havia preenchido anteriormente quando provoquei o erro na validação.

Espero que tenha sido mais claro.

Obrigado.

gomesrod

É, acho que tem razão :oops:

Agora voltando ao assunto, talvez se você colocar uns trechos mais importantes do código alguém consiga ter alguma idéia.

D

Pessoal,

Encontrei uma solução no Wiki da Apache, onde descreve este problema que estou tendo. Não ficou muito legal, pois estou usando somente ajax, e nesta solução tenho que recarregar a página.

A grosso modo, nesta solução da Apache ela passa por todo o ciclo de vida do jsf e seta para a fase inicial. Pelo que percebi o jsf mantém os valores preenchidos dos inputs (submitted values) quando você está na fase de validação (Process validations).

http://wiki.apache.org/myfaces/ClearInputComponents

De qualquer forma, segue o meu código para quem estiver com o mesmo problema. No método do action do botão Novo Usuário eu coloquei o código de refresh no link do wiki da Apache.

<a4j:form id="formPesquisa">
	<a4j:outputPanel ajaxRendered="true" id="barraOpcoes">
		...
		<a4j:commandButton style="width: 80px" value="Novo Usuário" action="#{administracaoPortalBean.create}" rendered="#{administracaoPortalBean.modeSelectUsuario}"  reRender="formUsuario" disabled="#{administracaoPortalBean.modeNewUsuario}" />
	</a4j:outputPanel>
</a4j:form>
...
<a4j:form id="formUsuario" >
	<a4j:outputPanel ajaxRendered="true" id="novoUsuario">
		...
		<h:outputText value="Login:" />
		<h:inputText id="login" value="#{administracaoPortalBean.usuario.id}" required="true" requiredMessage="Login obrigatório." />
		<h:message for="login" styleClass="mensagem" />
		...
		<a4j:commandButton style="width: 100px" value="Salvar" action="#{administracaoPortalBean.insert}" />
		<a4j:commandButton style="width: 100px" value="Cancelar" action="#{administracaoPortalBean.cancel}" immediate="true" />
	</a4j:outputPanel>
</a4j:form>

Mas se alguém tiver uma solução melhor que não necessite de reload na página, ok? :smiley:

Obrigado.

rponte

É necessário limpar a árvore de componentes, a maneira mais simples -e talvez a mais bruta- seria através do código abaixo:

protected void cleanSubmittedValues(UIComponent component) { component.getChildren().clear(); }
Basta você passar o componente pai (na maioria das vezes um h:panelGrid ou a4j:outputPanel) para o método e todos os componentes filhos dele serão resetados.

O link do wiki do Myfaces dá outras dicas, como resetar os componentes um por um (você pode implementar um método para fazer isso recursivamente).
Abraços e boa sorte.

Criado 22 de julho de 2009
Ultima resposta 22 de jul. de 2009
Respostas 8
Participantes 4