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

9 respostas
R
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:
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;
	}
Segue web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">	
	<display-name>ProtocoloDeAtendimento</display-name>
	<context-param>
   		<param-name>javax.faces.CONFIG_FILES</param-name>
    	<param-value>/WEB-INF/faces-config.xml</param-value>
 	</context-param>
 	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/applicationContext.xml
			/WEB-INF/applicationContext-security.xml
		</param-value>
	</context-param>
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<listener>
   		<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  	</listener> 	
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
    	<servlet-name>Faces Servlet</servlet-name>
    	<url-pattern>*.jsf</url-pattern>
  	</servlet-mapping>
  	<servlet-mapping>
    	<servlet-name>Faces Servlet</servlet-name>
    	<url-pattern>*.xhtml</url-pattern>
  	</servlet-mapping>
  	<servlet-mapping>
  	    <servlet-name>Faces Servlet</servlet-name>
    	<url-pattern>/faces/*</url-pattern>
 	</servlet-mapping>
	<session-config>
        <session-timeout>
            40
        </session-timeout>
    </session-config>
    <error-page>
    	<exception-type>
       		 javax.servlet.ServletException
    	</exception-type>
   		<location> 
        	/publico/login.xhtml 
    	</location>
	</error-page>
	<context-param>
    	<param-name>javax.faces.PROJECT_STAGE</param-name>
    	<param-value>Development</param-value>
  	</context-param>	
 	<welcome-file-list>
		<welcome-file>publico/login.xhtml</welcome-file>
	</welcome-file-list>
	<context-param>
		<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
		<param-value>client</param-value>
	</context-param>
	<context-param>
		<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
		<param-value>resources.application</param-value>
	</context-param>
	<listener>
    	<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
  	</listener> 	
	<resource-ref>
		<description>DataSource protocolo</description>
		<res-ref-name>jdbc/protocolo</res-ref-name>
		<res-type>javax.sql.DataSource</res-type>
		<res-auth>Container</res-auth>
	</resource-ref>
	<resource-ref>
		<description>Mail Session</description>
		<res-ref-name>mail/Session</res-ref-name>
		<res-type>javax.mail.Session</res-type>
		<res-auth>Container</res-auth>
	</resource-ref>	
	<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>	
	<context-param>
		<param-name>primefaces.THEME</param-name>
		<param-value>hot-sneaks</param-value>
	</context-param>
</web-app>
Segue faces config
<?xml version="1.0"?>
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">

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

9 Respostas

K

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

R
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.
<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>
K

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.

MiguelCP

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.

R

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.

MiguelCP

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.

R

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?

MiguelCP

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?

R

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.

Criado 25 de abril de 2013
Ultima resposta 6 de mai. de 2013
Respostas 9
Participantes 3