PrimeFaces: Remover registro no dataTable

Olá galera!
Estou querendo remover um registro de um <p:dataTabe /> com um diálogo de confirmação, porém ao clicar no botão para confirmar a remoção aparece o seguinte erro na console:

19/09/2012 17:00:37 javax.faces.event.MethodExpressionActionListener processAction
SEVERE: 'java.lang.IllegalArgumentException' recebido ao invocar escuta de ação '#{consultaMilitarBean.excluir}' para o componente 'confirm'
19/09/2012 17:00:37 javax.faces.event.MethodExpressionActionListener processAction
SEVERE: java.lang.IllegalArgumentException: attempt to create delete event with null entity
	at org.hibernate.event.spi.DeleteEvent.<init>(DeleteEvent.java:45)
	at org.hibernate.internal.SessionImpl.delete(SessionImpl.java:921)
	at br.org.siscoweb.repository.infra.MilitaresHibernate.remover(MilitaresHibernate.java:31)
	at br.org.siscoweb.service.GestaoMilitares.excluir(GestaoMilitares.java:20)
	at br.org.siscoweb.view.ConsultaMilitarBean.excluir(ConsultaMilitarBean.java:36)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:264)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at br.org.siscoweb.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:29)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:679)

19/09/2012 17:00:37 com.sun.faces.context.AjaxExceptionHandlerImpl log
SEVERE: JSF1073: javax.faces.event.AbortProcessingException obtido durante o processamento de INVOKE_APPLICATION 5: UIComponent-ClientId=form:confirm, Message=java.lang.IllegalArgumentException: attempt to create delete event with null entity
19/09/2012 17:00:37 com.sun.faces.context.AjaxExceptionHandlerImpl log
SEVERE: java.lang.IllegalArgumentException: attempt to create delete event with null entity
javax.faces.event.AbortProcessingException: java.lang.IllegalArgumentException: attempt to create delete event with null entity
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:182)
	at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
	at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769)
	at javax.faces.component.UICommand.broadcast(UICommand.java:300)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at br.org.siscoweb.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:29)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:679)
Caused by: java.lang.IllegalArgumentException: attempt to create delete event with null entity
	at org.hibernate.event.spi.DeleteEvent.<init>(DeleteEvent.java:45)
	at org.hibernate.internal.SessionImpl.delete(SessionImpl.java:921)
	at br.org.siscoweb.repository.infra.MilitaresHibernate.remover(MilitaresHibernate.java:31)
	at br.org.siscoweb.service.GestaoMilitares.excluir(GestaoMilitares.java:20)
	at br.org.siscoweb.view.ConsultaMilitarBean.excluir(ConsultaMilitarBean.java:36)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:264)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153)
	... 31 more

O botão para excluir está assim:

<p:commandButton onclick="confirmation.show()" icon="ui-icon-trash">
						<f:setPropertyActionListener
							target="#{consultaMilitarBean.selectedMilitar}"
							value="#{militar}" />
</p:commandButton>

O diálogo de confirmação está assim:

<p:confirmDialog id="confirmDialog" message="Deseja excluir?"
				header="Excluir militar" severity="alert" widgetVar="confirmation">

				<p:commandButton id="confirm" value="Sim" update="form"
					oncomplete="confirmation.hide()"
					actionListener="#{consultaMilitarBean.excluir}" />
				<p:commandButton id="decline" value="Não"
					onclick="confirmation.hide()" type="button" />
</p:confirmDialog>

O cabeçalho do dataTable:


			<p:dataTable var="militar" value="#{consultaMilitarBean.militares}"
			 paginator="true" rows="20" id="dataMilitar"
				emptyMessage="Lista vazia"
				paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}">

E o método para excluir no manegedBean:

public void excluir() {
		GestaoMilitares gestaoMilitares = new GestaoMilitares(
				this.repositorios.getMilitares());
		try {
			gestaoMilitares.excluir(selectedMilitar);

			this.inicializar();

			FacesUtil.adicionarMensagem(FacesMessage.SEVERITY_INFO,
					"Registro excluído com sucesso!");
		} catch (RegraNegocioException e) {
			FacesUtil.adicionarMensagem(FacesMessage.SEVERITY_ERROR,
					e.getMessage());
		}
	}

Quando eu estava usando os componentes padrões do JSF2 não tive problema algum, depois que coloquei os componentes do PrimeFaces começaram os problemas.

Alguém pode me ajudar?

tente trocar de actionListener para action.

podem haver problemas em usar actionListener juntamente com setPropertyActionListener.

[quote=digaoneves]tente trocar de actionListener para action.

podem haver problemas em usar actionListener juntamente com setPropertyActionListener.[/quote]

Desta forma também não funcionou.

Apareceu o erro:

20/09/2012 15:13:40 com.sun.faces.lifecycle.InvokeApplicationPhase execute
WARNING: #{consultaMilitarBean.excluir}: java.lang.IllegalArgumentException: attempt to create delete event with null entity
javax.faces.FacesException: #{consultaMilitarBean.excluir}: java.lang.IllegalArgumentException: attempt to create delete event with null entity
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:117)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at br.org.siscoweb.util.HibernateSessionFilter.doFilter(HibernateSessionFilter.java:29)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:108)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1001)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
	at java.lang.Thread.run(Thread.java:679)
Caused by: javax.faces.el.EvaluationException: java.lang.IllegalArgumentException: attempt to create delete event with null entity
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:101)
	... 29 more
Caused by: java.lang.IllegalArgumentException: attempt to create delete event with null entity
	at org.hibernate.event.spi.DeleteEvent.<init>(DeleteEvent.java:45)
	at org.hibernate.internal.SessionImpl.delete(SessionImpl.java:921)
	at br.org.siscoweb.repository.infra.MilitaresHibernate.remover(MilitaresHibernate.java:31)
	at br.org.siscoweb.service.GestaoMilitares.excluir(GestaoMilitares.java:20)
	at br.org.siscoweb.view.ConsultaMilitarBean.excluir(ConsultaMilitarBean.java:36)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at org.apache.el.parser.AstValue.invoke(AstValue.java:264)
	at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
	at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	... 30 more

Bom, o erro é que você está tentando dar um delete em null, e isso não é possível

coloque um breakpoint no seu setSelectedMilitar e veja que alguma hora antes da execução do seu método excluir vai ser enviado um null para ele.

[quote=digaoneves]Bom, o erro é que você está tentando dar um delete em null, e isso não é possível

coloque um breakpoint no seu setSelectedMilitar e veja que alguma hora antes da execução do seu método excluir vai ser enviado um null para ele.[/quote]

Quando eu seleciono o registro a ser excluído ele seta o setSelectedMilitar corretamente, porém quando eu confirmo a exclusão da caixa de diálogo o método recebe um valor null para ser removido…
Como posso resolver isso?

Qual o escopo do seu MB?

Não defini o escopo. Está o padrão mesmo.

Tente definir como @ViewScoped e veja se há alteração.

Um amigo meu se atentou ao fato de que seu ManagedBean pode estar sendo instanciado novamente, perdendo os valores.

[quote=digaoneves]Tente definir como @ViewScoped e veja se há alteração.

Um amigo meu se atentou ao fato de que seu ManagedBean pode estar sendo instanciado novamente, perdendo os valores.[/quote]

Cara, tah funcionando agora!

Mas só tem um detalhe agora.
Quando eu excluo um registro a tabela está atualizando normalmente, MAS quando eu pesquiso um registro utilizando o filterBy e excluo o registro NÃO ATUALIZA a tabela apesar de excluir normalmente o registro.

Minha coluna está assim:

<p:column filterBy="#{militar.nomeGuerra}">
					<f:facet name="header">
						<h:outputText value="Nome de guerra" />
					</f:facet>
					<h:outputText value="#{militar.nomeGuerra}" />
				</p:column>

Sabe o por que não atualiza?

Tem alguém aqui que pode me ajudar?
:?:

se vc usar o dataModel isso fica tão simples

acho que isso vai resolver seu problema, teste ai

[code]public void excluir() {
GestaoMilitares gestaoMilitares = new GestaoMilitares(
this.repositorios.getMilitares());
try {
gestaoMilitares.excluir(getSelectedMilitar()); // getSelectedMilitar()
this.passeSuaListaAqui.remove(getSelectedMilitar());

            this.inicializar();  
  
            FacesUtil.adicionarMensagem(FacesMessage.SEVERITY_INFO,  
                    "Registro excluído com sucesso!");  
        } catch (RegraNegocioException e) {  
            FacesUtil.adicionarMensagem(FacesMessage.SEVERITY_ERROR,  
                    e.getMessage());  
        }  [/code]
    }

tmvolpato,

obrigado por responder.
Desta forma também não resolveu. :?
A lista no managed bean está atualizando, o problema está sendo no dataTable mesmo que não está funcionando corretamente.
Alguém tem mais sugestão?

Parece que existe um bug no PrimeFaces que ainda não foi corrigido. Veja: http://code.google.com/p/primefaces/issues/detail?id=3970
Estou usando a última versão (3.4) e o bug foi reportado na versão 3.2

Olá galera, bom dia!!!

Wendell, estou com o mesmo problema que vc reportou por último…o dataTable não atualiza quando excluo um registro!!

Vc conseguiu resolver?..se sim, poderia me dizer como?

Meu botão/link está da seguinte forma:

<h:commandLink action="#{fornecedorBean.remover}" title="Excluir" onclick = "if(!confirm('Tem certeza que deseja excluir esse fornecedor?')) return false">
	<f:ajax execute="@form" render=":listagemFornecedor"/>
	<h:graphicImage library="imagens" name="excluir.png" style="border:0"/>
	<f:setPropertyActionListener target="#{fornecedorBean.fornecedor}" value="#{frn}"/>
</h:commandLink>

Obrigado!

Olá companheiro,

seu problema é exatamento como o meu? Tipo, só atualiza quando não utiliza do filtro? E se não utilizar o filtro funciona?
Se este for o seu caso também ainda não consegui resolver este problema. :frowning:

Opa…entendi vc dizer que estava tendo problema ao excluir um registro…se não for isso, desculpa!!

Meu problema é esse!..quando excluo um registro qualquer da tabela, funciona perfeitamente.

Porém, quando filtro por qualquer registro e mando excluir, não atualiza a tabela…o registro é excluído, mas só vejo isso se atualizar a página inteira ou se apagar os dados do filtro que coloquei como pesquisa!!!

Tem alguma ideia de como resolver isso?

No seu update acrescenta o id da tabela.

  <p:commandButton id="confirm" value="Sim" update=":form:idTabela"  
                    oncomplete="confirmation.hide()"  
                    actionListener="#{consultaMilitarBean.excluir}"/>

Flw !!!

Vlw camarada, pela ajuda…mas não funciona aqui pq não estou utilizando o <p:commandButton> e sim o <h:commandLink>…

estou ficando bolado com esse erro…sem filtrar, exclui perfeitamente em qualquer linha…mas filtrando, dá isso!!!

[quote=rof20004]No seu update acrescenta o id da tabela.

  <p:commandButton id="confirm" value="Sim" update=":form:idTabela"  
                    oncomplete="confirmation.hide()"  
                    actionListener="#{consultaMilitarBean.excluir}"/>

Flw !!!

[/quote]

Fiz o teste aqui e também não funcionou…

Acho que esse negócio está e bugado mesmo :?

[quote=leonardoteles]Vlw camarada, pela ajuda…mas não funciona aqui pq não estou utilizando o <p:commandButton> e sim o <h:commandLink>…

estou ficando bolado com esse erro…sem filtrar, exclui perfeitamente em qualquer linha…mas filtrando, dá isso!!![/quote]

Uai, so por o update no commandLink :wink: