Problema com valores de inputs em um rich:modalPanel [richfaces/JSF]

Tenho um rich:modalPanel que contém um a4j:form com campos h:inputText com o atributo required setado como true.
Abaixo dos campos, tenho dois botões:

  • “Cadastrar”: se houver mensagens de erro por causa dos required’s, o modalPanel continua aberto e o a4j:form é reRenderizado para aparecer as mensagens; se não, o método para cadastrar do meu managed-bean é chamado e, ao completar a requisição, o modalPanel é fechado.

  • “Cancelar”: é immediate=“true” e chama um método do managed-bean que instancia um novo objeto da entidade deste CRUD para que os campos sejam limpos. Ao completar essa requisição, o modalPanel é fechado.

Até aí, funciona perfeitamente. Só está ocorrendo problemas quando sigo a seguinte ordem de ações:

  1. Não completo todos os campos obrigatórios do a4j:form
  2. Clico em “Cadastrar” (como esperado, aparece as mensagens de erro sem fechar o modalPanel para que o usuário continue até completar)
  3. Ao invés de completar o formulário, resolvo clicar em “Cancelar” (como esperado, o modalPanel fecha e a instância do objeto é renovada - verifiquei isso no debug)
  4. Quando clico no link que abre o modalPanel (e este link também chama o método para renovar a instância), os dados que preenchi quando tentei cadastrar no passo 1 aparecem nos inputs. Este é o problema! Esses dados deveriam estar limpos na view.

Aparentemente os reRenders estão todos OK. Parece ser algum processamento do lado cliente, não sei…
Aí vai o código:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:rich="http://richfaces.org/rich"
      xmlns:a4j="http://richfaces.org/a4j">

<ui:composition template="../../template.xhtml">

    <ui:define name="menu">
        <ui:include src="../../blank.xhtml" />
    </ui:define>
   
    <ui:define name="main">
        <rich:modalPanel id="formModal" width="650" zindex="1000" top="50" autosized="true" onshow="enableEscInModal('formModal')">
            <f:facet name="header">
                <h:outputText value="#{parametroBean.updateMode ? 'Atualizar Parâmetros' : 'Cadastrar Parâmetros'}" />
            </f:facet>
            <f:facet name="controls">
                <h:panelGroup>
                    <a4j:form>
                        <h:graphicImage id="hideFormModal" styleClass="buttonClose" value="/imagem/button_close.gif">
                            <a4j:support event="onclick" onclick="$j('#buttonCancelar').click()" />
                        </h:graphicImage>
                    </a4j:form>
                </h:panelGroup>
            </f:facet>
            <a4j:form id="form" prependId="false">
                <script type="text/javascript">
                    $j(function() {
                        $j('#form input').keypress(function(event) {
                            if (event.keyCode == '13') {
                                event.preventDefault();
                            }
                        });
                    });
                </script>
                <rich:panel>
                    <ui:include src="/aplicacao/validationMessages.xhtml" />
                   
                    <h:panelGrid columns="2">
                        <h:outputText styleClass="labels" value="Pró-Reitor:" />
                        <h:inputText value="#{parametroBean.parametro.proReitor}" required="true" requiredMessage="Campo Pró-Reitor não preenchido" size="32" maxlength="32"/>
                       
                        <h:outputText styleClass="labels" value="Coordenador de Escolaridade:" />
                        <h:inputText value="#{parametroBean.parametro.coordEscolaridade}" required="true" requiredMessage="Campo Coordenador de Escolaridade não preenchido" size="32" maxlength="32" />
                       
                        <h:outputText styleClass="labels" value="Subcoordenador(a) da SCCE" />
                        <h:inputText value="#{parametroBean.parametro.subCoordenadorSCCE}" required="true" requiredMessage="Campo Subcoordenador(a) da SCCE não preenchido" size="32" maxlength="32" />
                       
                        <h:outputText styleClass="labels" value="Subcoordenador(a) da SCRD" />
                        <h:inputText value="#{parametroBean.parametro.subCoordenadorSCRD}" required="true" requiredMessage="Campo Subcoordenador(a) da SCRD não preenchido" size="32" maxlength="32" />
                       
                        <h:outputText styleClass="labels" value="Data de Entrada" />
                        <rich:calendar  id="dataEntrada" datePattern="dd/MM/yyyy" value="#{parametroBean.parametro.dataEntrada}" required="true" requiredMessage="Campo Data de Entrada não preenchido" />
                       
                        <h:outputText styleClass="labels" value="Atual" />
                        <h:selectBooleanCheckbox value="#{parametroBean.parametro.ativado}" />
                    </h:panelGrid>
                   
                    <div class="botoes">
                        <a4j:commandButton action="#{parametroBean.cadastrarParametro}" value="Cadastrar" rendered="#{!parametroBean.updateMode}" oncomplete="#{facesContext.maximumSeverity.ordinal > 0 ? 'Richfaces.showModalPanel(\'formModal\');' : 'Richfaces.hideModalPanel(\'formModal\');'}" reRender="#{facesContext.maximumSeverity.ordinal > 0 ? 'form' : 'panelListItens'}" />
                        <a4j:commandButton action="#{parametroBean.atualizarParametro}" value="Atualizar" rendered="#{parametroBean.updateMode}" oncomplete="#{facesContext.maximumSeverity.ordinal > 0 ? 'Richfaces.showModalPanel(\'formModal\');' : 'Richfaces.hideModalPanel(\'formModal\');'}" reRender="#{facesContext.maximumSeverity.ordinal > 0 ? 'form' : 'panelListItens'}" />
                        <a4j:commandButton id="buttonCancelar" value="Cancelar" immediate="true">
                            <a4j:support action="#{parametroBean.renewModel}" event="onclick" ajaxSingle="true" oncomplete="Richfaces.hideModalPanel('formModal');" reRender="form" />
                        </a4j:commandButton>
                    </div>
                </rich:panel>
            </a4j:form>
        </rich:modalPanel>
       
        <rich:panel header="Gerenciar Parâmetros" id="panelListItens">
            <h:form prependId="false">
                <ui:include src="/aplicacao/validationMessages.xhtml" />
               
                <rich:toolBar>
                    <rich:toolBarGroup>
                        <h:outputLink styleClass="addItem" value="javascript:void(0)">
                            <h:outputText value="Novos Parâmetros" />
                            <a4j:support event="onclick" action="#{parametroBean.sairModoAlteracao}" reRender="formModal, panelListItens" oncomplete="Richfaces.showModalPanel('formModal');" />
                        </h:outputLink>
                    </rich:toolBarGroup>
                   
                    <rich:toolBarGroup location="right">
                        <h:outputText styleClass="searchItem" value="Busca" />
                        <h:inputText value="#{parametroBean.pesquisa}" />
                        <h:commandButton action="#" value="Buscar" reRender="panelListItens" style="margin-right:10px" />
                    </rich:toolBarGroup>
                </rich:toolBar>
            </h:form>
           
            <br />
           
            <h:form id="listItens">
                <rich:dataTable id="tableList" value="#{parametroBean.parametrosOrdenados}" var="p" rows="100" width="100%">
                    <f:facet name="header">
                        <h:outputText value="Listagem de Parâmetros" />
                    </f:facet>
                   
                    <rich:column sortBy="#{p.proReitor}">
                         <f:facet name="header">
                             <h:outputText value="Pró-Reitor" />
                         </f:facet>
                         <h:outputText value="#{p.proReitor}" />
                     </rich:column>
                    
                     <rich:column sortBy="#{p.coordEscolaridade}">
                         <f:facet name="header">
                             <h:outputText value="Coord. Escol." />
                         </f:facet>
                         <h:outputText value="#{p.coordEscolaridade}" />
                     </rich:column>
                    
                     <rich:column sortBy="#{p.subCoordenadorSCCE}">
                         <f:facet name="header">
                             <h:outputText value="Subcoordenador(a) SCCE" />
                         </f:facet>
                         <h:outputText value="#{p.subCoordenadorSCCE}" />
                     </rich:column>
                    
                     <rich:column sortBy="#{p.subCoordenadorSCRD}">
                         <f:facet name="header">
                             <h:outputText value="Subcoordenador(a) SCRD" />
                         </f:facet>
                         <h:outputText value="#{p.subCoordenadorSCRD}" />
                     </rich:column>
                    
                     <rich:column sortBy="#{p.dataEntrada}">
                        <f:facet name="header">
                            <h:outputText value="Data de Entrada" />
                        </f:facet>
                        <h:outputText value="#{p.dataEntrada}" >
                            <f:convertDateTime type="date" timeStyle="short" />
                        </h:outputText>
                    </rich:column>
                   
                    <rich:column>
                        <f:facet name="header">
                            <h:outputText value="Atual" />
                        </f:facet>
                        <h:outputText value="#{p.ativado ? 'sim' : 'não'}" />
                    </rich:column>
                   
                    <rich:column style="text-align:center" width="6%">
                        <f:facet name="header">
                            <h:outputText value="Alterar" />
                        </f:facet>
                        <a4j:commandButton action="#{parametroBean.editarParametro}" oncomplete="Richfaces.showModalPanel('formModal');" image="../../../imagem/updateIcon.jpg" reRender="#{facesContext.maximumSeverity.ordinal > 0 ? 'formModal' : 'formModal, panelListItens'}">
                            <f:setPropertyActionListener value="#{p}" target="#{parametroBean.parametro}" />
                        </a4j:commandButton>
                    </rich:column>

                    <rich:column style="text-align:center" width="6%">
                        <f:facet name="header">
                            <h:outputText value="Excluir" />
                        </f:facet>
                        <a4j:commandButton action="#{parametroBean.removerParametro}" onclick="if(!confirm('Excluir item?')) return false" image="../../../imagem/mini_trash.gif" reRender="formModal, panelListItens">
                            <f:setPropertyActionListener value="#{p}" target="#{parametroBean.parametro}" />
                        </a4j:commandButton>
                    </rich:column>
                </rich:dataTable>
               
                <br clear="all" />
                <rich:datascroller for="tableList" maxPages="20" />
            </h:form>
        </rich:panel>
    </ui:define>
</ui:composition>
</html>

Estou com o mesmo problema, isso é devido ao campo required mesmo, mas não sei explicar o porque. Ele mantem o modal preenchido. Se voce editar e preencher os valores que estão requeridos, ele salva normalmente e não acontece mais o problema.

Voce conseguiu resolver este problema?

Se sim, como fez?

Obrigado.

Não consegui de jeito nenhum. Acontece exatamente o que você descreveu. A solução (gambiarra) que fiz foi dar um refresh na página com javascript ao clicar no “Cancelar”; dessa forma os valores são limpos. Isso tá parecendo ser algum bug do framework. Acho que manipulando alguma coisa do ciclo de vida do jsf se resolve esse problema. Quem encontrar primeiro uma solução sem gambi, responde ao tópico :stuck_out_tongue:

Abraço

Isso acontece quando voce usa o atributo required=“true” certo? se voce o retirar não acontece mais o problema.

Eu já tentei dar um new no objeto a ser editado, setar como null e depois new, já tentei setar um new Objeto no requestMap, ja tentei remover do requestMap, dei reRender suficiente em todos atributos suficientes, não há o que funcione.

Eu acredito que isso ocorra porque quando voce está editando, voce está trabalhando apenas com ajax (possivelmente), e não está realizando request na página, e acontece que quando voce da um submit no form, ou edita um objeto em um modal (sem solicitar request, apenas ajax), o jsf seta o atributo maximumSeverity (FacesContext.getCurrentInstance().getMaximumSeverity()), e isso fica tipo em “cache”, e como o modal é o mesmo para os objetos (diferentes), ele fica mantendo os valores antigos.

Eu acredito que limpando este atributo de maximumSeverity, deva resolver, o problema é que eu nao consegui isso.

Galera, sei que o tópico já é antigo, mas alguém conseguiu resolver este problema?

Estou na mesma situação e já tentei resolver de várias formas mas até agora nada. Se alguem teve algum progresso, qualquer que seja, favor postar aqui.

Pessoal,

Primeiramente, esse perfil não é meu e eu não faço a mínima ideia de quem seja por tanto não tentem entrar em contato comigo por esse perfil pois o proprietário se é que existe um não sabe da existência dessa resposta. Estou utilizando esse perfil graças à extensão para o Chrome BugMeNot. Eu a utilizei para logar e postar essa respostas pois percebi que vocês estavam completamente perdidos a respeito desse problema.

Leiam essa postagem que explica exatamente o que causa esse problema e dá três opções de solução para o problema. LEIAM TUDO!
http://www.rponte.com.br/2011/06/07/limpando-a-arvore-de-componentes/

Espero que ajude…

ps.: Caso queiram entrar em contato comigo podem o fazer pelo endereço http://qr.net/ALEX lá vocês encontraram diversas formas de entrar em contato comigo.