[Resolvido]Excluir JSF

Estou querendo fazer um botão de excluir em minha datatable, pesquisei pela net e vi que recomendam usar um commandlink, mas naum entendo como passar para o metodo exlcuir da classe controller a linha que quero apagar. Abaixo está minha datatable, então precisaria de ajuda para fazer o metodo excluir.

<p:dataTable id="tabela" var="produtos" value="#{produtoController.produtos}"> <p:column> <f:facet name="header"> <h:outputText value="Código"/> </f:facet> <h:outputText value="#{produtos.id}"/> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Nome"/> </f:facet> <h:outputText value="#{produtos.nome}"/> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Descrição"/> </f:facet> <h:outputText value="#{produtos.descricao}"/> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Excluir"/> </f:facet> <h:commandLink value="Excluir" action="#{produtoController.excluir}"/> </p:column> </p:dataTable>

Na tua classe controller, o método excluir recebe o item a ser excluido por parâmetro, e a chamada do commandLink ficaria assim:

<h:commandLink value=“Excluir” action="#{produtoController.excluir(produtos)}"/>

[code]public class ProdutoController {

UIData tabela;

public String excluir() {
    Produto produto = (Produto) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(tabela.getVar());
    /* Excluir... */
    return "SUCCESS";
 }

}
[/code]

<p:dataTable id="tabela" var="produtos" value="#{produtoController.produtos}" binding="#{produtoController.tabela}">

[code] public class ProdutoController {

   UIData tabela;  
 
   public String excluir(Produto produto) {  
       //Produto produto = (Produto) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(tabela.getVar());  
       /* Excluir... */  
       return "SUCCESS";  
    }  

} [/code]

<p:dataTable id="tabela" var="produtos" value="#{produtoController.produtos}">  
                     <p:column>  
                         <f:facet name="header">  
                             <h:outputText value="Código"/>  
                         </f:facet>  
                         <h:outputText value="#{produtos.id}"/>  
                     </p:column>  
                     <p:column>  
                         <f:facet name="header">  
                             <h:outputText value="Nome"/>  
                         </f:facet>  
                         <h:outputText value="#{produtos.nome}"/>  
                     </p:column>  
                     <p:column>  
                         <f:facet name="header">  
                             <h:outputText value="Descrição"/>  
                         </f:facet>  
                         <h:outputText value="#{produtos.descricao}"/>  
                     </p:column>  
                     <p:column>  
                         <f:facet name="header">  
                             <h:outputText value="Excluir"/>  
                         </f:facet>  
                         <h:commandLink value="Excluir" action="#{produtoController.excluir(produtos)}"/>  
                     </p:column>  
                 </p:dataTable> 

tente isso

<p:dataTable id="tabela" var="produtos" value="#{produtoController.produtos}">    
	<p:column>    
		 <f:facet name="header">    
			 <h:outputText value="Código"/>    
		 </f:facet>    
		 <h:outputText value="#{produtos.id}"/>    
	 </p:column>    
	 <p:column>    
		 <f:facet name="header">    
			 <h:outputText value="Nome"/>    
		 </f:facet>    
		 <h:outputText value="#{produtos.nome}"/>    
	 </p:column>    
	 <p:column>    
		 <f:facet name="header">    
			 <h:outputText value="Descrição"/>    
		 </f:facet>    
		 <h:outputText value="#{produtos.descricao}"/>    
	 </p:column>    
	 <p:column>    
		 <f:facet name="header">    
			 <h:outputText value="Excluir"/>    
		 </f:facet>    
		 <h:commandLink value="Excluir" action="#{produtoController.excluir(produtos)}">
		         <f:setPropertyActionListener value="#{produtos}" target="#{produtoController.produtos}" />
		 </p:commandLink>
	 </p:column>    
 </p:dataTable>  

tentei fazer como o rafaelsantini falou e aconteceu o seguinte erro:

binding="#{produtoController.tabela}": The class 'controller.ProdutoController' does not have the property 'tabela'.

já como o elton.souza falou me retorna um nullPointerException nessa linha do metodo excluir:

produto = (Produto) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(tabela.getVar());

e do modo que o viniciuspadua falou me retorna o seguinte erro:

Cannot convert model.Produto@1a437e of type class model.Produto to interface java.util.List
pelo que entendi está dizendo que naum pode transfomar uma lista de produtos em produto,
pois o meu objeto produtos que eu estou passando como parametro no commandlink é um ArrayList de produto,
e no meu metodo excluir está para receber um objeto do tipo produto, então agora naum sei como transformar esse arrayList de produtos em produto.

no caso que lhe mandei vc deve ter uma propriedade que seja apenas o bean e apontar para ele! e não para a lista

<h:commandLink value="Excluir" action="#{produtoController.excluir(produtos)}">  
       <f:setPropertyActionListener value="#{produtos}" target="#{produtoController.beanDoProduto}" />  
</p:commandLink>  

Então como voce falou alterei meu commandlink e ficou assim:

<h:commandLink value="Excluir" action="#{produtoController.excluir(produtos)}"> <f:setPropertyActionListener value="#{produtos}" target="#{produtoController.produto}" /> </h:commandLink>

e agora acontece nullPointerException e aqui está todo o erro:

javax.faces.el.EvaluationException: java.lang.NullPointerException at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102) at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) at javax.faces.component.UICommand.broadcast(UICommand.java:315) at javax.faces.component.UIData.broadcast(UIData.java:912) at org.primefaces.component.datatable.DataTable.broadcast(DataTable.java:620) at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775) at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267) at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82) 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:312) at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:277) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641) at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97) at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57) at com.sun.grizzly.ContextTask.run(ContextTask.java:69) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309) at java.lang.Thread.run(Thread.java:619) Caused by: java.lang.NullPointerException at controller.ProdutoController.excluir(ProdutoController.java:97) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at javax.el.BeanELResolver.invokeMethod(BeanELResolver.java:737) at javax.el.BeanELResolver.invoke(BeanELResolver.java:467) at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:246) at com.sun.el.parser.AstValue.invoke(AstValue.java:228) at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297) at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:98) at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88) ... 39 more

só que eu depurei e o objeto produto naum está vazio, está com todos os dados da linha em que eu aperto para exlcuir
então naum sei o que pode estar caousando isso.

verifique se inicializou o objeto.
ou seja

public class produtoController {

   private Produto produto = new Produto(); //Verifique se colocou isso

   //get and sets

}

sim inicializei o objeto
naum sei se tem algo errado com o metodo excluir, aqui vai o codigo

public void excluir(Produto produto) { produto = (Produto) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(tabela.getVar()); ProdutoDAO produtoDAO = new ProdutoDAO(); produtoDAO.delete(produto); }

Consegui resolver o problema da exclusão adicionando o binding="#{produtoController.tabela}"> na dataTable.
Então segue meu código.

<p:dataTable id="tabela" var="produtos" value="#{produtoController.produtos}" binding="#{produtoController.tabela}"> <p:column> <f:facet name="header"> <h:outputText value="Código"/> </f:facet> <h:outputText value="#{produtos.id}"/> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Nome"/> </f:facet> <h:outputText value="#{produtos.nome}"/> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Descrição"/> </f:facet> <h:outputText value="#{produtos.descricao}"/> </p:column> <p:column> <f:facet name="header"> <h:outputText value="Excluir"/> </f:facet> <h:commandLink value="Excluir" action="#{produtoController.excluir(produto)}"> <f:setPropertyActionListener value="#{produto}" target="#{produtoController.produto}" /> </h:commandLink> </p:column> </p:dataTable>

Controller

[code]
UIData tabela;

public UIData getTabela() {
    return tabela;
}

public void setTabela(UIData tabela) {
    this.tabela = tabela;
}

public void excluir(Produto produto) {
produto = (Produto) FacesContext.getCurrentInstance().getExternalContext().getRequestMap().get(tabela.getVar());
ProdutoDAO produtoDAO = new ProdutoDAO();
produtoDAO.delete(produto);
preencherTabela();
}[/code]

Só que agora toda vez que clico no Excluir a minha dataTable diminui de tamanho :?
será que tem alguma explicação para isso ??