Ola pessoal, estou com um problema que acredito que seja simples, fruto de minha fraca bagagem em Java, JSF e Primefaces. Tenho alguns campos input em meu formulário e um table que mostra os objetos incluídos, tanto os inputs quanto o table estão dentro do form, e na linha de cada objeto do table tem um botão excluir e outro editar, o excluir funciona bem o problema é o editar que quando clicado, se meus campos input text estiverem como required = true ele impedem que o objeto popule estes inputs, pois antes de popular os inputs são validados e como estão vazios, aparecem as mensagens que os campos são requeridos. Qual é o procedimento correto nestes casos, acredito que meu código esteja incorreto. Segue abaixo.<h:form id="form" acceptcharset="ISO-8859-1">
<p:panel>
<p:growl />
<p:messages showDetail="true" />
<p:fieldset legend="Protocolo" toggleable="false" toggleSpeed="500"
collapsed="false" id="proto">
<p:panelGrid styleClass="semBorda">
<p:row>
<p:column>
<h:outputLabel value="Numero:" for="txt_nrprotocolo" />
</p:column>
<p:column>
<p:inputText id="txt_nrprotocolo" size="12"
value="#{cadProtocoloBean.protocolo.codProtocolo}"
required="false"
requiredMessage="Obritório informar o numero da protocolo."
label="Núm. do protocolo" />
</p:column>
<p:column>
<h:outputLabel value="Emissao:" for="txt_dataEmissao" />
</p:column>
<p:column>
<p:calendar id="txt_dataEmissao" size="12" disabled="true"
value="#{cadProtocoloBean.protocolo.dtEmissao}"
label="Data emissao" />
</p:column>
</p:row>
<p:row>
<p:column>
<h:outputLabel value="Codigo:" for="txt_codCliente" />
</p:column>
<p:column>
<p:inputText id="txt_codCliente" size="12" required="true"
value="#{cadProtocoloBean.client.codCliente}"
label="Código Cliente">
<p:ajax event="blur" process="@this"
update="proto,client2"
listener="#{cadProtocoloBean.buscarCliente}" />
</p:inputText>
</p:column>
<p:column>
<h:outputLabel value="Nome:" for="txt_nome" />
</p:column>
<p:column colspan="5">
<p:inputText id="txt_nome" size="90" required="true"
value="#{cadProtocoloBean.client.nome}"
label="Nome Cliente" />
</p:column>
</p:row>
</p:panelGrid>
</p:fieldset>
<h:panelGrid columns="10" styleClass="semBorda">
<p:commandButton value="Salvar" action="#{cadProtocoloBean.novo}"
update="@form" style="margin:10px 0" id="btnSalvar" />
<p:commandButton value="Limpar"
action="#{cadProtocoloBean.limpar}" update="@form"
style="margin:10px 0" id="btnLimpar" />
</h:panelGrid>
</p:panel>
<p:dataTable id="tabela" value="#{cadProtocoloBean.protocolos}"
var="protocolo" emptyMessage="Não há registro há exibir!"
paginator="true" rows="5"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="5,10,15">
<p:column headerText="Editar/Excluir">
<p:commandButton icon="ui-icon-arrowrefresh-1-w"
action="#{cadProtocoloBean.editar}" update="@form">
<f:setPropertyActionListener target="#{cadProtocoloBean.protocolo}" value="protocolo"></f:setPropertyActionListener>
</p:commandButton>
<p:commandButton id="showDialogButton" onclick="confirmation.show()"
icon="ui-icon-close" title="Views">
<f:setPropertyActionListener value="#{protocolo}"
target="#{cadProtocoloBean.protocoloSelecionado}" />
</p:commandButton>
</p:column>
<p:column headerText="Núm. Protocolo">
<h:outputText value="#{protocolo.codProtocolo}" />
</p:column>
<p:column headerText="Cliente">
<h:outputText value="#{protocolo.Cliente.nome}" />
</p:column>
<p:column headerText="Cod. Cliente">
<h:outputText value="#{protocolo.Cliente.codCliente}" />
</p:column>
</p:dataTable>
<p:confirmDialog id="confirmDialog"
message="Deseja excluir o protocolo?"
header="Initiating destroy process" severity="alert"
widgetVar="confirmation">
<p:commandButton value="Sim" actionListener="#{cadProtocoloBean.excluir}" update="@form"
oncomplete="confirmation.hide()"/>
<p:commandButton id="decline" value="Não"
onclick="confirmation.hide()" type="button" />
</p:confirmDialog>
</h:form>
Coloque a propriedade immediate com valor true no seu botão que carrega os campos. Veja se funciona
Não funcionou, com o immediate não deu a mensagem de validação, mas deu erro na conversão do meu objeto para String dos inputs. Segue erro:
WARNING: Cannot convert protocolo of type class java.lang.String to class dominio.Protocolo
javax.el.ELException: Cannot convert protocolo of type class java.lang.String to class dominio.Protocolo
Isso aí não é culpa minha
Você que fez o setPropertyActionListener enviar uma String: <f:setPropertyActionListener target="#{cadProtocoloBean.protocolo}" value="protocolo">
</f:setPropertyActionListener>
o seu value está value=“protocolo” que é uma String
Ops…, hehehe, desculpe a falha, depois de corrigido o deslize funcionou perfeitamente, obrigado pela ajuda Rodrigo.
Sem problemas, mas você entendeu a solução? Você sabe o que muda quando a propriedade immediate tem valor true?
Rodrigo, já havia lido alguma coisa sobre isso, se não me engano esta ligado a fase em que a validação é feita, mas se tiver alguma referencia eu agradeço.