PrimeFaces dataTable em modal - erro ao carregar lista

Pessoal, preciso de uma ajuda.

Tenho uma data table dentro de um p:dialog que está dentro da minha template xhtml. Estou usando facelets e minha estrutura está assim:

template -> admin ->create -> create_quotation_modulo

na create_quotation_modulo.xhtml eu tenho um p:commandButton que chama este modal. Este commandbutton é criado dinamicamente na classe java, dependendo do retorno do banco. Segue código:


else if(conteudoModulo.getConteudoItemModulo().equals("button")){ 
			
			UIOutput labelInputText = new UIOutput();
			labelInputText.setId("label_button_"+contador);
			labelInputText.getAttributes().put("style", "margin-left:5px; font-size: 85%;");
			labelInputText.setValue(ContextoBean.getBundle().getString("web_"+conteudoModulo.getItemModulo()) + ":");
			panelgrid.getChildren().add(labelInputText);
			
			InputText inputText = new InputText();
			inputText.setDisabled(true);
			inputText.setId(conteudoModulo.getItemModulo()+"_text_"+contador);
			inputText.getAttributes().put("style", conteudoModulo.getTamanhoCampo());
			inputText.setValueExpression("value", createValueExpression("#{criarCotacaoController."+nomeListaResultado+"[" + (listaResultado.size()) + "]}", String.class));
			listaResultado.add("");
			listaComponentes.add(conteudoModulo.getItemModulo());
			panelgrid.getChildren().add(inputText);
			
			MethodBinding action = application.createMethodBinding("#{criarCotacaoController.habilitaBuscaProduto}", null);
			
			CommandButton button2 = new CommandButton();
			button2.setId("btn_prime_"+contador);
			button2.setValue(ContextoBean.getBundle().getString("btn_pesquisar"));
			button2.setUpdate("form_quotation");
			button2.setAction(action);
			panelgrid.getChildren().add(button2);
}

public void habilitaBuscaProduto(){
		
		listaProdutoModel = new ProdutoDataModel();
		codigoDescricaoProcurado = "";
		
		 org.primefaces.context.RequestContext.getCurrentInstance().execute("dlgPesquisaCodigoProduto.show()");

	}

No dlgPesquisaCodigoProduto eu tenho meu filtro de busca e minha tabela, onde eu posso selecionar 1 item. Segue código:

<p:dialog modal="true" widgetVar="statusDialog"
		header="#{msgs.web_global_emprocessamento}" draggable="false"
		closable="false">
		<p:graphicImage value="/resources/images/template/ajaxloadingbar.gif" />
	</p:dialog>
	
	
	<p:dialog widgetVar="dlgPesquisaCodigoProduto" id="idDlgPesquisaCodigoProduto" modal="true" resizable="false">
		<h:form id="form_pesquisa_codigo_produto">
			<p:growl id="msg" showDetail="false" escape="false" />

			<p:panelGrid styleClass="semBorda" columns="1">
			<h:outputLabel value="#{msgs.global_selecione_tipo_pesquisa}:" for="select_tipo_pesquisa_codigo_produto" />
			<p:selectOneMenu id="select_tipo_pesquisa_codigo_produto" required="true" requiredMessage="#{msgs.global_campo_obrigatorio}"
					value="#{criarCotacaoController.tipoPesquisaSelecionada}"
					converter="simpleEntityConverter"
					style="width:210px; margin-left:8px;">
					<f:selectItems value="#{criarCotacaoController.listaTipoPesquisaCodigoProduto}" />
				</p:selectOneMenu>
			
			</p:panelGrid>
			
			<p:panelGrid styleClass="semBorda" columns="3">
				<p:inputText id="codigo_descricao_procurado" required="true" requiredMessage="#{msgs.global_campo_obrigatorio}"
					value="#{criarCotacaoController.codigoDescricaoProcurado}" style="width:250px;" />

				<h:commandButton id="procurar_codigo_produto" value="#{msgs.web_global_buscar}"
					actionListener="#{criarCotacaoController.procurarCodigoProduto()}"
					onclick="statusDialog.show();" oncomplete="javascript:fecha(xhr, status, args);" 
					styleClass="btn_procurar_user" update=":form_pesquisa_codigo_produto:tabela_resultado_pesquisa" />

			</p:panelGrid>
			<br />

			<p:dataTable id="tabela_resultado_pesquisa"
				styleClass="tabela_resultado_pesquisa" var="produto"
				value="#{criarCotacaoController.listaProdutoModel}"
				paginator="true" rows="10" rowKey="#{produto.descricao}"
				selection="#{criarCotacaoController.produtoSelecionado}"
				selectionMode="single" emptyMessage="#{msgs.global_nenhum_registro}">


				<p:ajax event="rowSelect"
					listener="#{criarCotacaoController.produtoSelecionado}"
					oncomplete="self.location= 'Edit_user.jsf';" />





				<f:facet name="header">
		          <h:outputLabel value="#{msgs.global_resultado_pesquisa}" />
		        </f:facet>

				<p:column
					style="max-width: 250px; min-width: 250px; overflow: hidden; text-align: center">
					<f:facet name="header">
						<h:outputText value="#{msgs.global_codigo_produto}" />
					</f:facet>
					<h:outputText value="#{produto.id}" />
				</p:column>

				<p:column
					style="max-width: 400px; min-width: 400px; overflow: hidden">
					<f:facet name="header">
						<h:outputText value="#{msgs.global_descricao_produto}" />
					</f:facet>
					<h:outputText value="#{produto.descricao}" />
				</p:column>

			</p:dataTable>

		</h:form>

	</p:dialog>

Segue o código do meu bean, de busca (ainda com a busca fake):

	public void procurarCodigoProduto() {
		listaProdutoPesquisado = new ArrayList<Produto>();
		
		
		listaProdutoPesquisado.add(new Produto(1234567, "Produto1"));
		listaProdutoPesquisado.add(new Produto(3242423, "Produto2"));
		listaProdutoPesquisado.add(new Produto(6551234, "Produto3"));
		listaProdutoPesquisado.add(new Produto(5678654, "Produto4"));
		listaProdutoPesquisado.add(new Produto(9865327, "Produto5"));
		listaProdutoPesquisado.add(new Produto(3172350, "Produto6"));
		
		listaProdutoModel = new ProdutoDataModel(listaProdutoPesquisado);
		
		requestContext = RequestContext.getCurrentInstance();
		requestContext.addCallbackParam("fechar", false);
		
	}

código do meu ProdutoDataModel:

package br.com.gd.bpp.controller.datamodel;

import java.util.List;

import javax.faces.model.ListDataModel;

import org.primefaces.model.SelectableDataModel;

import br.com.gd.bpp.core.dominio.infra.Produto;

public class ProdutoDataModel extends ListDataModel<Produto> implements SelectableDataModel<Produto> {
	
	public ProdutoDataModel() {
		// TODO Auto-generated constructor stub
	}
	
	public ProdutoDataModel(List<Produto> data) {
		super(data);
	}

	@SuppressWarnings("unchecked")
	@Override
	public Produto getRowData(String rowKey) {		
		List<Produto> listaProduto = (List<Produto>) getWrappedData(); 
        
        for(Produto produto : listaProduto) {  
            if(produto.getDescricao().equals(rowKey)){  
                return produto;  
            }
        }           
        return null; 
	}

	@Override
	public Object getRowKey(Produto produto) {	
		return produto.getDescricao();
	}
}

Quando eu clico em Buscar, dentro do meu modal, eu tenho o seguinte erro:

INFO: 10:32:40,978 ERROR MyFilterSecurityInterceptor:64 -  Exception: javax.servlet.ServletException
javax.servlet.ServletException
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:606)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1542)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:343)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:368)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:109)
	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	at br.com.gd.bpp.security.MyFilterSecurityInterceptor.invoke(MyFilterSecurityInterceptor.java:62)
	at br.com.gd.bpp.security.MyFilterSecurityInterceptor.doFilter(MyFilterSecurityInterceptor.java:42)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:97)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:100)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:78)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:119)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:35)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:187)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	at org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:109)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	at org.springframework.security.web.access.channel.ChannelProcessingFilter.doFilter(ChannelProcessingFilter.java:109)
	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169)
	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
	at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:849)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:746)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1045)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:228)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
	at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.NullPointerException
	at org.primefaces.component.datatable.DataTable.getRowData(DataTable.java:794)
	at org.primefaces.component.datatable.feature.SelectionFeature.decodeSingleSelection(SelectionFeature.java:46)
	at org.primefaces.component.datatable.feature.SelectionFeature.decode(SelectionFeature.java:37)
	at org.primefaces.component.datatable.DataTableRenderer.decode(DataTableRenderer.java:53)
	at javax.faces.component.UIComponentBase.decode(UIComponentBase.java:787)
	at org.primefaces.component.api.UIData.processDecodes(UIData.java:224)
	at javax.faces.component.UIForm.processDecodes(UIForm.java:225)
	at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176)
	at org.primefaces.component.dialog.Dialog.processDecodes(Dialog.java:352)
	at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176)
	at javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176)
	at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:933)
	at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
	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)
	... 60 more

Alguém sabe oq pode esta acontecendo? ja estou a 3 dias quebrando a cabeça com isto…

Boa Tarde

Tenta alterar o trecho do código:

<h:commandButton id="procurar_codigo_produto" value="#{msgs.web_global_buscar}" actionListener="#{criarCotacaoController.procurarCodigoProduto()}" onclick="statusDialog.show();" oncomplete="javascript:fecha(xhr, status, args);" styleClass="btn_procurar_user" update=":form_pesquisa_codigo_produto:tabela_resultado_pesquisa" />

Para:

[code]<p:commandButton id=“procurar_codigo_produto” value="#{msgs.web_global_buscar}"
actionListener="#{criarCotacaoController.procurarCodigoProduto}"
oncomplete=“handleComplete(xhr, status, args)”;"
styleClass=“btn_procurar_user” update=":form_pesquisa_codigo_produto:tabela_resultado_pesquisa" />

;JavaScript
function handleComplete(xhr, status, args) {

        if(args.validationFailed) {
            //alert("Erro de Validação");
        } 
        else {
                            
            if(args.action=='statusDialog'){
             statusDialog.show();
             }
       }

}
[/code]

Bean

ActionEvent import javax.faces.event.ActionEvent;

[code]public void procurarCodigoProduto(ActionEvent event) {
listaProdutoPesquisado = new ArrayList();

listaProdutoPesquisado.add(new Produto(1234567, "Produto1"));  
listaProdutoPesquisado.add(new Produto(3242423, "Produto2"));  
listaProdutoPesquisado.add(new Produto(6551234, "Produto3"));  
listaProdutoPesquisado.add(new Produto(5678654, "Produto4"));  
listaProdutoPesquisado.add(new Produto(9865327, "Produto5"));  
listaProdutoPesquisado.add(new Produto(3172350, "Produto6"));  
  
listaProdutoModel = new ProdutoDataModel(listaProdutoPesquisado);  
RequestContext context = RequestContext.getCurrentInstance();
context.addCallbackParam("action", "statusDialog");

}
[/code]

Não funcionou não.

AO clicar no botão não fez nada. Coloquei no botão ajax=“false” e deu o mesmo erro… :cry:

O Erro que está dando é de rowKey…

se eu tirar o rowKey e o selection da tabela, ele funciona de boas…

Entendo …

Pergunta:

Sua Classe Produto implements Serializable ?

:idea: Vamos dividir pra conquistar …

Tira o rowKey="#{produto.descricao}" da DataTable e não declare a coluna com o produto.id

Testa ai …