Problema para atualizar a página JSF

12 respostas
R

Galera, meu problema eh o seguinte:
eu tenho uma popup para busca de logradouros, e eu
implementei essa popup usando alguns p:inputTexts para a pesquisa e
uma p:datatable para listagem, dentro de uma p:dialog.
Quando o usuário clica numa linha da datatable, é para atualizar 3 campos
na página de cadastro, com as informações do registro selecionado. Isso funciona da primeira vez,
mas apenas para 2 campos(nome da rua e nome do bairro), e depois da primeira vez não funciona mais
para campo nenhum, e o campo que não funciona nem na primeira vez é o campo do CEP.
Eu debuguei e observei que no bean os valores são alterados perfeitamente, mas quando volta para a
página, os campos não são atualizados.
alguém pode me ajudar?
abaixo segue o código da página, só com os campos a serem atualizados, e tbm com a p:dialog:

<h:outputText value="CEP:"/>
                                <p:inputText id="logrCEP" value="#{empresaBean.logradouro.logrCep}">
                                    <f:ajax event="blur" execute="@this" listener="#{empresaBean.pesquisarPorCep}" render="logrCEP logrCodigo logrNome logrBairro"/>
                                </p:inputText>
                                <p:commandLink onclick="popupLogradouro.show()" title="Abrir Popup de Busca">
                                    <h:graphicImage url="/images/lens_32x32.png" width="24" height="26" style="border: none;"/>
                                </p:commandLink>
                                <h:inputHidden id="logrCodigo" value="#{empresaBean.logradouro.LOGRCodigo}" required="true" requiredMessage="O Logradouro &eacute; Obrigat&oacute;rio"/>

                                <h:outputText value="Endere&ccedil;o:"/>
                                <p:inputText id="logrNome" value="#{empresaBean.empresa.EMPREndereco}" required="true" requiredMessage="O Endere&ccedil;o &eacute; Obrigat&oacute;rio"/>
                                <h:outputText/>
                                <h:outputText value="Bairro:"/>
                                <p:inputText id="logrBairro" value="#{empresaBean.empresa.EMPRBairro}" required="true" requiredMessage="O Bairro &eacute; Obrigat&oacute;rio"/>

<p:dialog  header="Escolha um Logradouro" widgetVar="popupLogradouro" modal="true" draggable="false"
                                  width="680" resizable="false" showEffect="fold" hideEffect="slide" closeOnEscape="true">
                            <h:panelGrid id="pesquisarCEP" columns="5">
                                <h:outputText value="Estado"/>
                                <h:outputText value="Cidade"/>
                                <h:outputText value="Logradouro"/>
                                <h:outputText/>
                                <h:outputText/>

                                <p:inputText onblur="this.value = this.value.toUpperCase();" maxlength="2" binding="#{logradouroBean.selectEstado}" id="ddlUF" style="width: 50px;"/>
                                <p:inputText id="itCidade" binding="#{logradouroBean.inputCidade}" value="#{logradouroBean.cidade}" />
                                <p:inputText id="itLogradouro" binding="#{logradouroBean.inputRua}" value="#{logradouroBean.logr}"/>
                                <p:commandLink action="#{logradouroBean.pesquisar}" immediate="true" ajax="true" onstart="imgAjax.show();" oncomplete="imgAjax.hide();" update="tabelaLogradouro,msg">
                                    <h:graphicImage url="/images/lens_32x32.png" width="24" height="26" style="border: none;"/>
                                </p:commandLink>
                            </h:panelGrid>
                <p:dataTable id="tabelaLogradouro" var="logrListar" value="#{logradouroBean.listaPopup}"
                                     emptyMessage="Nenhum Registro Encontrado" paginator="true" rows="10"
                                     paginatorTemplate="{FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"
                                     paginatorPosition="bottom" selectionMode="single" selection="#{empresaBean.logradouro}"
                                     update="logrCEP,logrCodigo,logrNome,logrBairro" style="font-size: 13px; width:100%;">
                                    <f:facet name="header">
                                        Lista de Logradouros
                                    </f:facet>
                                    <p:column filterBy="#{logrListar.LOGRNome}" filterMatchMode="contains" filterStyle="width: 100%;">
                                        <f:facet name="header">
                                            <h:outputText value="Nome"/>
                                        </f:facet>
                                        <h:outputText value="#{logrListar.LOGRNome}"/>
                                    </p:column>
                                    <p:column filterBy="#{logrListar.logrCep}" filterMatchMode="startsWith" filterStyle="width: 100%;">
                                        <f:facet name="header">
                                            <h:outputText value="CEP"/>
                                        </f:facet>
                                        <h:outputText value="#{logrListar.logrCep}"/>
                                    </p:column>
<!--                                    <p:column>
                                        <p:commandLink title="Ok" ajax="true" actionListener="{empresaBean.atualizarCEP}" update="logrCEP,logrCodigo,logrNome,logrBairro">
                                            <h:graphicImage url="images/check_mark_32x32.png" height="24" width="24" style="border: none;"/>
                                            <f:setPropertyActionListener value="{logradouroBean.listaPopup}" target="{empresaBean.listaLogradouros}"/>
                                        </p:commandLink>
                                    </p:column>-->
                            </p:dataTable>
                        </p:dialog>

só mais um detalhe: a tag f:ajax dentro do inputText do CEP é para o caso do usuário saber o CEP e não precisar da popup,
então ele digita o CEP e quando o campo perder o foco o sistema busca o endereço do CEP digitado.

12 Respostas

J

Eu tive muitos problemas ao misturar f:ajax com o ajax embutido nos componentes do Primefaces no mesmo ‘form’, ele fazia com que o código Javascript ‘quebrasse’ em determinados momentos fazendo com que as atualizações deixassem de funcionar sem explicações.
Sugestão, troque o f:ajax por p:ajax:

<f:ajax event="blur" execute="@this" listener="#{empresaBean.pesquisarPorCep}" render="logrCEP logrCodigo logrNome logrBairro"/>
<p:ajax event="blur" process="@this" listener="#{empresaBean.pesquisarPorCep}" update="logrCEP,logrCodigo,logrNome,logrBairro"/>
R

fiz a alteração, mas ainda não funcionou. =/

J

Bom, o que eu faria na sequência seria ver o código html gerado, se nos seus commandLinks os ids dos campos incluídos no ‘update’ estão aparecendo incluindo os prefixos (os gerados pelo Primefaces ou o nome do form Ex. form1:logrCep).
Eles precisam estar exatamente iguais tanto no update como no id do componente.
Nesse ponto que acontecia a quebra de código que falei antes, se for o caso o próximo passo será tentar isolar o problema…

T

Você vincula um mesmo objeto à dois componentes distintos?

tipo, numa form e depois dentro de uma dialog?

R

jamirdeajr:
Bom, o que eu faria na sequência seria ver o código html gerado, se nos seus commandLinks os ids dos campos incluídos no ‘update’ estão aparecendo incluindo os prefixos (os gerados pelo Primefaces ou o nome do form Ex. form1:logrCep).
Eles precisam estar exatamente iguais tanto no update como no id do componente.
Nesse ponto que acontecia a quebra de código que falei antes, se for o caso o próximo passo será tentar isolar o problema…

eu verifiquei e os ids estão sendo gerados corretamente… os ids gerados nos inputText são iguais aos ids gerados no update da tabela.

R

Takeshi91:
Você vincula um mesmo objeto à dois componentes distintos?

tipo, numa form e depois dentro de uma dialog?

bom Takeshi91, o que acontece eh o seguinte:
no form eu tenho o campo CEP, que é um p:inputText e referencia
o atributo logrCep do objeto logradouro, que está em empresaBean.
também no form eu tenho um inputHidden para armazenar o código
do logradouro, e esse inputHidden referencia o atributo logrCodigo,
do objeto logradouro de empresaBean.
ai na p:dataTable que está dentro da p:dialog eu uso o objeto logradouro novamente
no selection da datatable, que eh pra quando o usuário selecionar um registro, o sistema
setar o objeto logradouro la no bean com o registro escolhido pelo usuário.
num sei vc considera isso associar um mesmo objeto a 2 componentes, mas eh desse jeito que to fazendo.

T

Na propriedade do logradouro, tente setar um objeto à parte igual ao objeto obtido ao selecionar a linha, e use as propriedades deste objeto nos outros componentes.

Vale a tentativa. Eu estava com um problema parecido.

Selecionava uma linha na dataTable, e o objeto selecionado era usado para gerar outra busca no banco, e popular uma outra dataTable, porém, eu tentei usar o mesmo objeto para preencher umas inputTexts que dão opção de edição ao usuario, quando relacionava o mesmo objeto para a segunda dataTable e para as inputTexts, o objeto era perdido.

tipo
getObjeto() {
     return objeto;
}
setObjeto(Objeto objeto) {
     this.objeto = objeto;

     setOutroObjeto(objeto);
}

getOutroObjeto() {
     return outroObjeto;
}
setOutroObjeto(Objeto outroObjeto) {
     this.outroObjeto= outroObjeto;

}
// Na View...
<p:dataTable selection="#{SeuManagedBean.objeto}" />
<h:inputText value="#{SeuManagedBean.outroObjeto.propriedade}" />
R

Takeshi91, tentei sua solução, mas ainda não deu certo.
eu acho que eh algum problema com a view, pq quando
eu debugo vejo que no bean os valores são alterados corretamente quando eu seleciono uma linha na tabela.
mas obrigado pela ajuda.

T

Não está usando RequestScoped neah? ‘-’

R

não, os beans são sessionScoped. o mais estranho de tudo é que em outros sistemas aqui da empresa eu apliquei essa popup e funciona, e nesse sistema agora tbm tava funcionando, mas ai quando eu adicionei a tag f:ajaxpra buscar pelo CEP quando o campo perdesse o foco, parou de funcionar a atualização dos campos pela popup, e agora mesmo que eu tire a tag f:ajax a popup não volta a funcionar, mas a busca pela tag f:ajax funciona numa boa.

R

Olá

Eu estou com o mesmo problema, já descobri mais o menos o que é, pelo o que li na web isto ocorre porque apenas o campo cep não é required, ou seja, os outros são atualizados porque são validados pelo JSF, por serem required.

Agora só falta descobrir como contornar isto.

R

coloquei o seguinte dentro do método set

FacesContext.getCurrentInstance().getViewRoot().getChildren().clear();

Isto limpa o conteúdo dos campos do formulário antes de atualizar.

Criado 6 de abril de 2011
Ultima resposta 3 de mai. de 2011
Respostas 12
Participantes 4