Estou com um problema em uma pequena aplicação que estou desenvolvendo na hora de alterar um registro. Não consigo recuperar o objeto e carregá-lo na página para alterar seus valores. Ex: Tenho um p:dataTable que possui uma coluna com 2 botões (Alterar e Excluir) e ao clicar em Alterar, deve ser mostrada a página com os dados desse registro carregados nos campos. Porém isso não acontece, a página sempre é carregada em branco. Segue o meu código:
DataTable
<p:dataTableid="planoList"rows="10"paginator="true"value="#{planoSaudeController.lista}"var="plano"paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"emptyMessage="Nenhum registro encontrado!"><p:column><f:facetname="header"><h:outputTextvalue="Nome do Plano"/></f:facet><h:outputTextvalue="#{plano.nomePlano}"/></p:column><p:column><f:facetname="header"><h:outputTextvalue="Descrição"/></f:facet><h:outputTextvalue="#{plano.descricao}"/></p:column><p:column><f:facetname="header"><h:outputTextvalue="Ação"/></f:facet><p:commandButtonicon="ui-icon-pencil"title="Visualizar/Alterar"action="#{planoSaudeController.createUpdate}"><f:setPropertyActionListenervalue="#{plano}"target="#{planoSaudeController.planoSaude}"/></p:commandButton><p:commandButtonicon="ui-icon-trash"title="Excluir"update="form"oncomplete="confirm.show()"><f:setPropertyActionListenervalue="#{plano}"target="#{planoSaudeController.planoSaude}"/></p:commandButton></p:column></p:dataTable>
Nesse metodo de update o valor de ‘planoSaude’ está nulo?
H
hugo.hlcxcx
cara, na verdade essa action que está no dataTable ela apenas retorna uma String que irá redirecionar o usuário para a tela de alteração.
A
alberthy
<h:form />
Não será esse o problema ?
R
raf4ever
O que eu quis dizer é:vc está instanciando esse objeto em algum momento?
H
hugo.hlcxcx
alberthy:
<h:form />
Não será esse o problema ?
Com certeza não. O p:dataTable está dentro de um h:form só não coloquei aqui pois não achei que fosse importante. Mas segue o código completo da página:
<ui:compositiontemplate="../../resources/template/template.xhtml"><ui:definename="title">.:GestãodePlanosdeSaúde:.</ui:define><ui:definename="content"><p:panelheader="Gestão de Planos de Saúde"><h:formid="searchForm"><br/><h:panelGridcolumns="3"><p:commandButtonvalue="Novo Plano"icon="ui-icon-plus"action="#{planoSaudeController.createUpdate}"immediate="true"/><p:inputTextid="searchbox"value="#{planoSaudeController.pesquisa}"size="50"/><p:commandButtonvalue="Pesquisar"icon="ui-icon-search"update="form"/></h:panelGrid><br/><br/></h:form><h:formid="form"><p:messages/><p:dataTableid="planoList"rows="10"paginator="true"value="#{planoSaudeController.lista}"var="plano"paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"emptyMessage="Nenhum registro encontrado!"><p:column><f:facetname="header"><h:outputTextvalue="Nome do Plano"/></f:facet><h:outputTextvalue="#{plano.nomePlano}"/></p:column><p:column><f:facetname="header"><h:outputTextvalue="Descrição"/></f:facet><h:outputTextvalue="#{plano.descricao}"/></p:column><p:column><f:facetname="header"><h:outputTextvalue="Ação"/></f:facet><p:commandButtonicon="ui-icon-pencil"title="Visualizar/Alterar"action="#{planoSaudeController.createUpdate}"><f:setPropertyActionListenervalue="#{plano}"target="#{planoSaudeController.planoSaude}"/></p:commandButton><p:commandButtonicon="ui-icon-trash"title="Excluir"update="form"oncomplete="confirm.show()"><f:setPropertyActionListenervalue="#{plano}"target="#{planoSaudeController.planoSaude}"/></p:commandButton></p:column></p:dataTable></h:form><h:formid="dlg"><p:confirmDialogmessage="Deseja realmente excluir o plano selecionado ?"widgetVar="confirm"header="Advertência"severity="alert"><h:panelGridcolumns="2"id="display"><p:commandButtonvalue="Sim"icon="ui-icon-check"actionListener="#{planoSaudeController.excluir}"oncomplete="confirm.hide()"process="@form"update="form:planoList"/><p:commandButtonvalue="Não"icon="ui-icon-cancel"onclick="confirm.hide()"type="button"/></h:panelGrid></p:confirmDialog></h:form></p:panel></ui:define></ui:composition>
@raf4ever
Sim, eu estou instanciando o objeto no ManagedBean. Segue:
@ManagedBeanpublicclassPlanoSaudeController{privatePlanoSaudeplanoSaude=newPlanoSaude();privatePlanoSaudeplanoSelecionado=newPlanoSaude();privateList<PlanoSaude>planos=newArrayList<PlanoSaude>(0);privatebooleanalterar=false;privateStringpesquisa;@EJBprivatePlanoSaudeBeanLocalplanoBean;publicStringsalvar(){FacesContextcontext=FacesContext.getCurrentInstance();FacesMessagemessage=newFacesMessage();try{if(getPlanoSaude().getId()!=null){planoBean.update(getPlanoSaude());message.setSummary("Plano de Saúde atualizado com sucesso!");message.setSeverity(FacesMessage.SEVERITY_INFO);context.addMessage(null,message);}else{planoBean.save(getPlanoSaude());message.setSummary("Plano de Saúde salvo com sucesso!");message.setSeverity(FacesMessage.SEVERITY_INFO);context.addMessage(null,message);}setPlanoSaude(newPlanoSaude());returnnull;}catch(Exceptione){e.printStackTrace();message.setSummary("Erro inesperado ao salvar Plano de Saúde!");message.setSeverity(FacesMessage.SEVERITY_ERROR);context.addMessage(null,message);returnnull;}}publicvoidexcluir(ActionEventevent){FacesContextcontext=FacesContext.getCurrentInstance();FacesMessagemessage=newFacesMessage();try{System.out.println(getPlanoSelecionado().toString());planoBean.delete(PlanoSaude.class,getPlanoSelecionado().getId());message.setSummary("Plano de Saúde excluído com sucesso!");message.setSeverity(FacesMessage.SEVERITY_INFO);context.addMessage(null,message);}catch(Exceptione){e.printStackTrace();message.setSummary("Erro inesperado ao excluir Plano de Saúde!");message.setSeverity(FacesMessage.SEVERITY_ERROR);context.addMessage(null,message);}}publicList<PlanoSaude>getLista(){planos=planoBean.list(PlanoSaude.class,null,"nomePlano");returnplanos;}publicStringcreateUpdate(){return"planoCreateUpdate";}publicStringlist(){return"planoList";}publicPlanoSaudegetPlanoSaude(){returnplanoSaude;}publicvoidsetPlanoSaude(PlanoSaudeplanoSaude){this.planoSaude=planoSaude;}publicList<PlanoSaude>getPlanos(){returnplanos;}publicvoidsetPlanos(List<PlanoSaude>planos){this.planos=planos;}publicbooleanisAlterar(){returnalterar;}publicvoidsetAlterar(booleanalterar){this.alterar=alterar;}publicPlanoSaudegetPlanoSelecionado(){returnplanoSelecionado;}publicvoidsetPlanoSelecionado(PlanoSaudeplanoSelecionado){this.planoSelecionado=planoSelecionado;}publicStringgetPesquisa(){returnpesquisa;}publicvoidsetPesquisa(Stringpesquisa){this.pesquisa=pesquisa;}}
R
raf4ever
Pra que dois h:form na página?Eu acho que isso pode ter alguma coisa a ver com o problema.
W
wender.jean
Cara, muitos dos problemas que eu já tive com jsf estava relacionado ao uso de dois form na página, faz em um só que deve funcionar.
H
hugo.hlcxcx
Pessoal, removi um dos forms mas mesmo assim, ainda não consigo carregar os dados para alteração.
<?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"><htmlxmlns="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:p="http://primefaces.org/ui"><ui:compositiontemplate="../../resources/template/template.xhtml"><ui:definename="title">.: Gestão de Planos de Saúde :.</ui:define><ui:definename="content"><p:panelheader="Gestão de Planos de Saúde"><h:formid="form"><br/><p:messages/><h:panelGridcolumns="3"><p:commandButtonvalue="Novo Plano"icon="ui-icon-plus"action="#{planoSaudeController.createUpdate}"immediate="true"/><p:inputTextid="searchbox"value="#{planoSaudeController.pesquisa}"size="50"/><p:commandButtonvalue="Pesquisar"icon="ui-icon-search"update="form"/></h:panelGrid><br/><br/><p:dataTableid="planoList"rows="10"paginator="true"value="#{planoSaudeController.lista}"var="plano"paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"emptyMessage="Nenhum registro encontrado!"><p:column><f:facetname="header"><h:outputTextvalue="Nome do Plano"/></f:facet><h:outputTextvalue="#{plano.nomePlano}"/></p:column><p:column><f:facetname="header"><h:outputTextvalue="Descrição"/></f:facet><h:outputTextvalue="#{plano.descricao}"/></p:column><p:column><f:facetname="header"><h:outputTextvalue="Ação"/></f:facet><p:commandButtonicon="ui-icon-pencil"title="Visualizar/Alterar"action="#{planoSaudeController.createUpdate}"><f:setPropertyActionListenervalue="#{plano}"target="#{planoSaudeController.planoSaude}"/></p:commandButton><p:commandButtonicon="ui-icon-trash"title="Excluir"update="form"oncomplete="confirm.show()"><f:setPropertyActionListenervalue="#{plano}"target="#{planoSaudeController.planoSaude}"/></p:commandButton></p:column></p:dataTable></h:form><h:formid="dlg"><p:confirmDialogmessage="Deseja realmente excluir o plano selecionado ?"widgetVar="confirm"header="Advertência"severity="alert"><h:panelGridcolumns="2"id="display"><p:commandButtonvalue="Sim"icon="ui-icon-check"actionListener="#{planoSaudeController.excluir}"oncomplete="confirm.hide()"process="@form"update="form:planoList"/><p:commandButtonvalue="Não"icon="ui-icon-cancel"onclick="confirm.hide()"type="button"/></h:panelGrid></p:confirmDialog></h:form></p:panel></ui:define></ui:composition></html>
D
DarthCego
Ola amigo
Porque voce nao tenta dar um update no seu form assim
vamos enxugar seu código um pouco primeiro… vc não precisa usar isso [color=red]paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink}"[/color] o paginator=“true” já resolve tranquilo…
na hora de vc selecionar em alterar… vc ta clicando na coluna do datatable certo? vc precisar ter outras tags pra quando clicar ele atualizar os campos que vc quer… tem que ter a tag selection="#{seuObjeto}" e um onRowSelectUpdate=“idCampos” eu geralmente coloco todos os campos dentro de um h:panelGrid e defino o ID(idCampos)… e coloco as inputs dentro dele… ai quando clico na linha que quero… ele fecha o dataTtable e joga nos campos a linha que eu cliquei…
e use actionListener de preferencia…
H
hugo.hlcxcx
lordaj:
na hora de vc selecionar em alterar… vc ta clicando na coluna do datatable certo? vc precisar ter outras tags pra quando clicar ele atualizar os campos que vc quer… tem que ter a tag selection="#{seuObjeto}" e um onRowSelectUpdate=“idCampos” eu geralmente coloco todos os campos dentro de um h:panelGrid e defino o ID(idCampos)… e coloco as inputs dentro dele… ai quando clico na linha que quero… ele fecha o dataTtable e joga nos campos a linha que eu cliquei…
e use actionListener de preferencia…
Poderia dar um exemplo cara ? Não entendi muito bem o que vc quis dizer.
O método action no meu código apenas redireciona o usuário pra tela de alteração, então não vejo pq de se usar actionListener. Ou estou enganado ?
axo q vc nao precisa redirecionar… quando vc fizer a pesquisa… vc joga o resultado em uma dialog igual essa q to mostrando… ai ela vai ter o resultado no datatable… ai quando vc clicar 2x em alguma das linhas q ele retornou da pesquisa… vc manda atualizar os campos que vc quer sacou? nao precisa jogar pra oouuuuutra página… dentro dessa ai basta criar uma dialog… q vai trazer o resultado… quando clicar 2x já era… fecha a dialog… e preenche os campos… tendeu? vc pode colocar tudo isso na página de atualização mesmo… pesquisa… seleciona e preenche os campos., ai evita isso de precisar redirecionar.
H
hugo.hlcxcx
Alguém ?
H
hugo.hlcxcx
Pessoal, me dêem uma força pois só tenho mais uma semana para terminar esse projeto.
Desde já agradeço.
R
raf4ever
hugo.hlcxcx:
Pessoal, me dêem uma força pois só tenho mais uma semana para terminar esse projeto.
Desde já agradeço.
Se vc botar um breakpoint no metodo createUpdate(),qual é o valor de ‘planoSaude’?
R
raf4ever
Creio que o problema esteja aqui:
private PlanoSaude planoSaude = new PlanoSaude();
Devido o teu ManagedBean estar com escopo de requisição,quando vc chama o createUpdate o estado do objeto é resetado,dai a página aparecer em branco.
A
Ace
Tenta anotar seu MB como:
@viewScoped
pode ser que funfe como o amigo ai em cima disse!..
vlw
D
d34d_d3v1l
porra,
é foda, li o tópico inteiro até fiquei curioso pra saber se resolveu
e o topico morreu sem solução…
afff isso desanima! Senhor autor, poderia por favor dar o feedback?
Será de grande contribuição
flw
V
vicenthy
Também estou com esse mesmo problema
up
R
rof20004
Vo posta um exemplo de como uso para fazer isso, clicar no botao do datatable e abrir uma pagina para alterar:
Uso o <f:facet> somente para dar um nome para coluna, mas isto pode ser substituido acrescentando um header, um proprio atributo da tag <p:column>
Uso o commandLink, mas voces podem ficar a vontade para usar commandButton, dentro da tag commandLink ponho um texto, e ponho um <f:param>, e é aqui que ta o segredo, ao clicar no commandLink, ele passa o id para o bean, que por sua vez carrega a pagina h:commandLink action="#{projetoListMB.getNextView}" setada no meu proprio bean. lembrando que bean é o var do datatable, exemplo: