[RESOLVIDO] Erro simples ao editar objeto com campos input com a propriedade required = true

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 :slight_smile:

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.

Veja se isso aqui ajuda:

https://cwiki.apache.org/MYFACES/how-the-immediate-attribute-works.html