[Resolvido]Problemas com UPDATE primefaces + jsf

5 respostas
A

E ae galera,

Tenho uma aplicação dividida em duas partes, uma lista com registros do banco, e um formulario para efetuar atualizações nos registros. Quando o usuário seleciona um item na lista, automaticamente o formulario recebe os atributos do item selecionado. Ali ele pode alterar os valores e salvar novamente.

O problema é que nem todos os atributos devem ser alterados, então aqueles que não vou alterar eu deixo sem inputText. O erro está que quando o usuário clica em salvar, os campos que não tem inputText ficam nulos e se perdem no espaço sideral.

Esse é o meu formulário, como podem ver, o código não deveria estar aí. Aí vem alguém e diz “Ah, usa output ou readOnly=true”. Já tentei, mesmo problema. Além desse tem outros campos que nem devem estar aí.

<p:panel id="fichaLocalidade" style="height:360px;" > 
            <p:panelGrid id="panel" columns="2" style="margin-bottom:10px">

              <h:outputLabel value="Código:" />
              <p:inputText id="codigo" value="#{localidadeController.localidade.id.codigo}"/>

              <h:outputLabel value="Nome:" />
              <p:inputText id="nome" value="#{localidadeController.localidade.nome}"/>

              <p:commandButton id="insert" value="Salvar" action="#{localidadeController.adiciona}" icon="ui-icon-disk" ajax="false" />
              <p:commandButton id="delete" value="Apagar" action="#{localidadeController.remove}"   icon="ui-icon-trash" ajax="false" />
            
            </p:panelGrid> 
          </p:panel>

A aplicação é bem grande, então se precisar de mais código eu posto aqui…

Obrigado por enquanto galera!!!

5 Respostas

M

Amigo,

Você poderia postar o formulário inteiro? Assim podemos verificar se alguma coisa lá atrás não está “danificando” o resto do seu form.
Uma dica poderosa é tentar criar isolamentos, com panel e outras coisas que faça você renderizar somente um pedaço do form, ou seja, nunca renderizar todo o form, quando é necessário esse tipo de transação, assim você economiza processamento e tempo com estas coisas.

Um abraço.

A

Boa tarde matheusgeres.

Primeiro agradeço aí pelo interesse. A aplicação inteira é um pouco grande, sendo assim estruturei só com os form’s e o painel que tem o botão para salvar. Mas agora que comentou sobre a renderização algo começou a fazer sentido. Vejamos, quando eu seleciono um item de minha lista, é executado o seguinte comando:

<p:ajax event="rowSelect" listener="#{localidadeController.onRowSelect}" update=":formTemplate:useCase:mapPanel, :formTemplate:useCase:fichaLocalidade, :formTemplate:useCase:outputTituloLocalidade" />

Ou seja, em teoria estou renderizando a :formTemplate:useCase:fichaLocalidade inteira. Até aí sem problemas, debugando eu consigo comprovar que a minha entidade está com a entidade que eu selecionei na lista. O problema é quando clico no botão salvar, a partir daí tudo que não representei na minha página fica null.

<h:form id="formTemplate">
  <h:form id="useCase">

          <p:panel style="height:390px;">
            <p:dataTable id="tabela" emptyMessage="Sem dados" paginatorPosition="bottom" paginator="true" rows="10"  var="localidade" value="#{localidadeController.localidades}" selectionMode="single" selection="#{localidadeController.selectedLocalidade}" rowKey="#{localidade.id.codigo}">  
              <f:facet name="header">  
                <p:commandButton id="refreshButton" value="Atualizar" icon="ui-icon-refresh" update="tabela" action="#{localidadeController.lista}" ajax="false"/>  
              </f:facet>
              <p:column headerText="Código"> #{localidade.id.codigo} </p:column>  
              <p:column headerText="Nome"> #{localidade.nome} </p:column> 

              <p:ajax event="rowSelect" listener="#{localidadeController.onRowSelect}" update=":formTemplate:useCase:mapPanel, :formTemplate:useCase:fichaLocalidade, :formTemplate:useCase:outputTituloLocalidade" /> 

            </p:dataTable>    
          </p:panel>

          <p:panel id="fichaLocalidade" style="height:360px;" > 
            <p:panelGrid id="panel" columns="2" style="margin-bottom:10px">

              <h:outputLabel value="Código:" />
              <p:inputText id="codigo" value="#{localidadeController.localidade.id.codigo}"/>

              <h:outputLabel value="Nome:" />
              <p:inputText id="nome" value="#{localidadeController.localidade.nome}"/>

              <p:commandButton id="insert" value="Salvar" action="#{localidadeController.adiciona}" icon="ui-icon-disk" ajax="false" />
              <p:commandButton id="delete" value="Apagar" action="#{localidadeController.remove}"   icon="ui-icon-trash" ajax="false" />
            
            </p:panelGrid> 
          </p:panel>  
  </h:form>
</h:form>

matheusgeres:
Amigo,

Você poderia postar o formulário inteiro? Assim podemos verificar se alguma coisa lá atrás não está “danificando” o resto do seu form.
Uma dica poderosa é tentar criar isolamentos, com panel e outras coisas que faça você renderizar somente um pedaço do form, ou seja, nunca renderizar todo o form, quando é necessário esse tipo de transação, assim você economiza processamento e tempo com estas coisas.

Um abraço.

M

E seu backbean? Como ele está?
Tive problema parecidos quando o botão de ok, salvar, excluir e etc, quando estava em outro form, que não me enviava os dados, desta forma resolvi passando o id da conversation e as variáveis não se perderam no limbo. Um exemplo seria assim:

<p:commandButton value="Gravar" actionListener="#{bean.gravar()}" icon="ui-icon-disk" update=":form:elemento" rendered="#{bean.isPossuiDireitoGravar}"> <f:param name="cid" value ="#{bean.conversation.id}" /> </p:commandButton>

E lembrando que tenho get e setter do conversation injetado no meu Bean.

A

matheusgeres:
E seu backbean? Como ele está?
Tive problema parecidos quando o botão de ok, salvar, excluir e etc, quando estava em outro form, que não me enviava os dados, desta forma resolvi passando o id da conversation e as variáveis não se perderam no limbo. Um exemplo seria assim:

<p:commandButton value="Gravar" actionListener="#{bean.gravar()}" icon="ui-icon-disk" update=":form:elemento" rendered="#{bean.isPossuiDireitoGravar}"> <f:param name="cid" value ="#{bean.conversation.id}" /> </p:commandButton>

E lembrando que tenho get e setter do conversation injetado no meu Bean.

Era por aí o problema mesmo. Eu fiz uma limpa nos forms, deixei somente um para todo o caso de uso e funcionou belezinha. Agora vou te dizer, esses form’s são cheios de frescuras… o splitbutton ainda é um mistério pra mim, em dias de chuva ele não funciona, em dias de sol funciona que é uma beleza…

Bom, valeu amigo, fiz umas brincadeiras mas sei que é até pegar bem os macetes dos form’s…

Abraço e tenha um bom final de semana…

M

Realmente o problema com os forms é recorrente, mas nada do que alguns dias sofridos não possa ajudar. Recomendo sempre utilizar o Firebug, ele ajuda muito em clarear os possíveis problemas em tela, costuma sempre trazer algum alerta vermelho.

Está certo, que bom poder ajudar.

Criado 12 de abril de 2013
Ultima resposta 13 de abr. de 2013
Respostas 5
Participantes 2