[RESOLVIDO]Problema Primefaces + Spring especificamente componente p:dataTable

Olá pessoal, sou inciante nestas tecnologias e estou com problema para enviar objeto do meu p:dataTable para o meu Bean, tenho dois forms na pagina xhtml, um com os campos input que eu salvo os objetos e outro form que eu listo os últimos objetos salvos através de um dataTable, no form dos input esta tudo certo envio e consigo salvar os dados, no form do dataTable eu não consigo enviar nenhum dos objetos para o bean para que eu possa joga-lo para o outro form para editar ou possa exclui-lo diretamente. Já testei a aplicação e sei que o método editar e o método excluir são chamados, porem o objeto em questão não vai pra o bean. Segue o código: <h:form id="tables"> <p:dataTable id="tabela" value="#{cadProtocoloBean.protocolos}" var="protocolo" emptyMessage="Não há registro há exibir!" paginator="false" rows="50" widgetVar="protocoloTabela" filteredValue="#{cadProtocoloBean.protocolosFiltrados}" > <f:facet name="header"> <p:outputPanel style="float:right;"> <h:outputText value="Procurar: " /> <p:inputText id="globalFilter" onkeyup="protocoloTabela.filter()" style="width:150px" /> </p:outputPanel> </f:facet> <p:column headerText="Editar/Excluir"> <p:commandButton icon="ui-icon-arrowrefresh-1-w" action="#{cadProtocoloBean.setProtocolo(protocolo)}" update="@(:editar)" /> <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" filterBy="#{protocolo.codProtocolo}" filterMatchMode="exact"> <h:outputText value="#{protocolo.codProtocolo}" /> </p:column> </p:dataTable></h:form>
Segue bean:[code]

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.application.FacesMessage.Severity;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;

import org.apache.commons.mail.EmailException;
import org.primefaces.model.StreamedContent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope(“request”)
public class CadProtocoloBean {

@Autowired
private ICadProtocolo protocoloService;

@Autowired
private IUsuarioService usuarioService;

private Protocolo protocolo = new Protocolo();

private Protocolo protocoloSelecionado;

private List<Protocolo> protocolos = new ArrayList<Protocolo>();
private List<Protocolo> protocolosFiltrados = new ArrayList<Protocolo>();


private StreamedContent arquivoRetorno;
private int tipoRelatorio;
private int diasEmAberto;
private String msg, msgDetalhe, messager;
private Severity tipoMsg = FacesMessage.SEVERITY_INFO;



public void excluir() throws FalhaDeExclusaoException,
		FalhaDePesquisaException {		
	if ((enviaEMAILService.listarEmails(this.protocoloSelecionado)
			.isEmpty())
			&& (enviaSMSService.listarMensagens(this.protocoloSelecionado)
					.isEmpty())) {

		protocoloService.delete(this.protocoloSelecionado);
		protocolos.remove(this.protocoloSelecionado);
		protocolosFiltrados.remove(this.protocoloSelecionado);
		protocolo = new Protocolo();
		benf = new Beneficiario();
		coop = new Cooperado();
		MensagemBean.mensagem(FacesMessage.SEVERITY_INFO,
				"Protocolo excluído com sucesso", "");
	} else {
		tipoMsg = FacesMessage.SEVERITY_WARN;
		msg = ("Este protocolo não pode ser excluído porque já foi enviado e-mail.");
		msgDetalhe = ("");
		mensagem();
	}

}
public Protocolo getProtocolo() {
	return protocolo;
}

public void setProtocolo(Protocolo protocolo) {
	this.coop = protocolo.getCooperado();
	this.benf = protocolo.getBeneficiario();
	this.protocolo = protocolo;
}[/code]

Segue web.xml

[code]

<?xml version="1.0" encoding="UTF-8"?>


ProtocoloDeAtendimento

javax.faces.CONFIG_FILES
/WEB-INF/faces-config.xml


contextConfigLocation

/WEB-INF/applicationContext.xml
/WEB-INF/applicationContext-security.xml



org.springframework.web.context.ContextLoaderListener


org.springframework.web.context.request.RequestContextListener


Faces Servlet
javax.faces.webapp.FacesServlet
1


Faces Servlet
.jsf


Faces Servlet
.xhtml


Faces Servlet
/faces/



40




javax.servlet.ServletException


/publico/login.xhtml



javax.faces.PROJECT_STAGE
Development


publico/login.xhtml


javax.faces.STATE_SAVING_METHOD
client


javax.servlet.jsp.jstl.fmt.localizationContext
resources.application


com.sun.faces.config.ConfigureListener


DataSource protocolo
jdbc/protocolo
javax.sql.DataSource
Container


Mail Session
mail/Session
javax.mail.Session
Container


springSecurityFilterChain
org.springframework.web.filter.DelegatingFilterProxy


springSecurityFilterChain
/



primefaces.THEME
hot-sneaks

[/code]
Segue faces config

[code]<?xml version="1.0"?>

<application>
	<el-resolver>org.springframework.web.jsf.el.SpringBeanFacesELResolver</el-resolver>
</application>

[/code]

já tentou por o atributo process="@this" no botão que contém o setPropertyActionListener?

Coloquei como falou o process="@this", porem desta forma meu confirmDialog não processou a ação excluir, clicava no botão e não fazia nada, o botão “não” é que funcionou e cancelou a ação. Segue codigo do confirmDialog. [code]<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=”@(:tables)"
oncomplete=“confirmation.hide()” />

					<p:commandButton id="decline" value="Não"
						onclick="confirmation.hide()" type="button" />
				</p:confirmDialog>[/code]

Ponha o process="@this" tbem no seu botão de sim.
Procure sempre se acostumar a usar esse atributo para dizer
ao JSF o que vc quer processar com a ação, se não me engano o process do prime
por default e @form. Perceba q ao não colocar o process no botão “não” vai processar o form sem necessidade.

Cara faz o seguinte:


<p:dataTable id="tabela" value="#{cadProtocoloBean.protocolos}"   
                        var="protocolo" emptyMessage="Não há registro há exibir!"  
                        paginator="false" rows="50" widgetVar="protocoloTabela"  
                        filteredValue="#{cadProtocoloBean.protocolosFiltrados}" rowKey="#{protocolo.id}" selectionMode="single" >
<p:ajax event="rowSelect" update=":tables:iddodialog"/>

e exclui esta linha

<f:setPropertyActionListener value="#{protocolo}" target="#{cadProtocoloBean.protocoloSelecionado}" />

e nos command´s button troca update="@(:editar)" por update=":tables:editar"
Espero ter te ajudado.

Kleber fiz conforme indicou e não resolveu. Miguel não entendi como fazer no Bean o excluir, pois meu excluir utiliza o objeto protocoloSelecionado, se eu retirar o setPropertyActionListener do xhtml o que vou pegar para localizar o objeto e exclui-lo?

Faltou complementar que eu utilizava este mesmo esquema antes de integrar com o Spring, e funcionava bem, envia o objeto para o bean tanto no editar quanto no excluir.

Foi mal pela demora.

Neste formato que eu te indiquei quando selecionar a linha…irá aparecer o dialog no mesmo você poderá fazer esta função de excluir e alterar também.

Miguel sem problema nenhum quanto a demora, agora, eu sou iniciante no assunto e ainda não entendi como tratar essa sua sugestão, primeiro eu devo ter um dialog com o nome do update da tabela “iddodialog” ? Depois neste dialog como eu pego o id que foi mandado no rowKey="#{protocolo.id}" para excluir, uma vez que este protocolo segundo o que entendo só existe no table?

Na sugestão que te falei o que efetivamente vai acontecer é ao invés de ter o botão para chamar o dialog a propria linha ao ser selecionada irá chamar o dialog.
ja no update, pelo menos nos casos que vi, sempre é chamado ,por exemplo, :IDdoForm:compenentqueestácontidonoform entendeu?

Pessoal desculpe a demora, mas consegui resolver meu problema utilizando o DataModel do Primefaces, criei uma classe public class ProtocoloDataModule extends ListDataModel implements SelectableDataModel e utilizei no meu table e ai consegui pegar os dados que eu queria. Obrigado a todos.