Problema para recuperar informações do Checkbox em um DataTable do PrimeFaces

Olá pessoal,

Já estou algumas semanas quebrando bastante a cabeça e pesquisando aqui no forum algumas soluções mas até agora não evolui muito. Estou desenvolvendo uma aplicação com PrimeFaces Mobile para que liste os produtos e permita ao usuario selecionar os produtos desejados e em seguida ir para uma outra pagina que contem um datatable com os produtos que ele selecionou, tipo um carrinho de compras.

Estou conseguindo listar os produtos que veem de uma consulta ao Banco de Dados Sql Server pela classe RN(Regra de Negocios) que busca da DAO. Mas quando ele seleciona os produtos jogo para o Bean e na hora de acessar a próxima pagina para listar o que foi selecionado não esta funcionando, pois traz a lista em branco.

Agradeço antecipadamente a quem poder me ajudar com essa solução outro com uma dica de uma outra forma de implementar esta solução.

Segue meu Bean:

[code]
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;
import orcamentomobile.produto.Produto;
import orcamentomobile.produto.ProdutoRN;
import org.primefaces.context.RequestContext;

/**
*

  • @author cleber
    */
    @ManagedBean(name=“produtoBean”)
    @ViewScoped
    public class ProdutoBean implements Serializable{
    private List listarProdutos=null;
    private String descricaoProduto="";
    private Produto[] produtosSelecionados;

    HttpSession session = (HttpSession) FacesContext.getCurrentInstance().getExternalContext().getSession(false);

    public List getListarProdutos() {
    String filialSelecionada = (String) session.getAttribute(“filial”);

     ProdutoRN rn = new ProdutoRN();
     listarProdutos = rn.listarProdutos(descricaoProduto,filialSelecionada );
     
     return listarProdutos;
    

    }

    public void setListarProdutos(List listarProdutos) {
    this.listarProdutos = listarProdutos;
    }

    public String getDescricaoProduto() {
    return descricaoProduto;
    }

    public void setDescricaoProduto(String descricaoProduto) {
    this.descricaoProduto = descricaoProduto;
    }

    public Produto[] getProdutosSelecionados() {
    return produtosSelecionados;
    }

    public void setProdutosSelecionados(Produto[] produtosSelecionados) {
    this.produtosSelecionados = produtosSelecionados;
    }

    public String irMontagemOrcamento(){ //Fazendo redirecionamento pelo Bean é melhor do que direto pela pagina. Pois acessa o .xthml corretamente

     return "montagemOrcamento?faces-redirect=true";
    

    }

}[/code]

Segue meu .xhtml que lista os produtos

<f:view xmlns="http://www.w3.org/1999/xhtml"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui"
        xmlns:pm="http://primefaces.org/mobile"
        contentType="text/html"
        renderKitId="PRIMEFACES_MOBILE">
     <style type="text/css">   
        .ui-datatable .ui-datatable-data .even-row td{  
            background-color:#EEE9E9;  
        }  
  
        .ui-datatable .ui-datatable-data .odd-row td{  
            background-color:#CDC9C9;  
        }  
                </style>  
   
    <pm:page title="Components">
       
         <!-- Main View -->
        <pm:view id="index">
            <pm:header title="PESQUISA DE PRODUTOS" swatch="b">
                <f:facet name="left"><p:button value="Back" icon="back" href="montagemOrcamento.jsf"/></f:facet>
            </pm:header>
        <pm:content>
            <h:form id="formFiltros">
               
                <p:outputLabel value="Descrição: " />
                <p:inputText id="descprod" value="#{produtoBean.descricaoProduto}" />
                <p:commandButton value="Consultar" update=":formListarProdutos" />
            </h:form>
            
            <hr />
            <h:form id="formListarProdutos" >
                <p:commandButton value="OK" action="#{produtoBean.irMontagemOrcamento}" />
               
                <p:dataList>
                  
                    <p:dataTable id="multiprods" var="produto" value="#{produtoBean.listarProdutos}" 
                                 selection="#{produtoBean.produtosSelecionados}" 
                                 rowKey="#{produto.codpro}"
                                 emptyMessage="Nenhum registro encontrado." 
                                 rowStyleClass="#{empty rowIx or rowIx mod 2 ne 0 ? 'even-row' : 'odd-row'}" rowIndexVar="rowIx">
                        
                       <p:column headerText="Seleção" width="2%" selectionMode="multiple" />
                       <p:column headerText="Código" width="10%">
                           <h2><h:outputText value="#{produto.codpro}" /></h2>
                        </p:column>
                           

                        <p:column headerText="Descricao" width="50%">
                            <h:outputText value="#{produto.descricaoLonga}" />
                        </p:column>
                        
                        <p:column headerText="Referencia" width="40">
                           
                            <h:outputText value="#{produto.codigoInterno}" />
                           
                        </p:column>
                        
                        <p:column headerText="Preço" >
                            <h:outputText value="#{produto.precoVen}"/>
                        </p:column>
                    </p:dataTable>
               </p:dataList>
          </h:form>
            
       </pm:content>   
         
   </pm:view>
       
</pm:page>
</f:view>

E por ultimo a pagina que deve conter os produtos selecionados:

<f:view xmlns="http://www.w3.org/1999/xhtml"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:p="http://primefaces.org/ui"
        xmlns:pm="http://primefaces.org/mobile"
        contentType="text/html"
    renderKitId="PRIMEFACES_MOBILE">
    <pm:page title="Components">
       
         <!-- Main View -->
        <pm:view id="index">
            <pm:header title="INCLUSAO DOS PRODUTOS" swatch="b">
                <f:facet name="left"><p:button value="Back" icon="back" href="index.jsf"/></f:facet>
            </pm:header>
     
         <pm:content>
        
       <p:dataList type="inset">
                     <f:facet name="header">Filtros</f:facet>
                     <h:outputText value="NUMERO PEDIDO: #{pedidoBean.numeroPedido} - VENDEDOR: #{pedidoBean.vendedorAtual.nome} - Filial:#{pedidoBean.filial}"  />
                    <h:form>
                     
                        <p:commandButton value="PESQUISAR" action="#{pedidoBean.irPresquisaProduto}"  />
                    </h:form> 
                 
              <h:form>
                 
                  <p:dataTable var="produto" value="#{produtoBean.produtosSelecionados}" emptyMessage="Nenhum registro encontrado.">
                       <p:column headerText="Codigo" width="50%">
                           <h:outputText value="#{produto.codpro}" />
                        </p:column>
                      
                      <p:column headerText="Descrição" width="50%">
                          <h:outputText value="#{produto.descricaoLonga}" />
                        </p:column>
                        
                        
                  </p:dataTable>
             </h:form>
                    
                    <h:form>
               
                    <p:commandButton value="CONFIRMAR"  />
                     <h:outputLink  value="../logout"> Sair
                    </h:outputLink>
               
                    </h:form>
              </p:dataList>      
  </pm:content>   
   </pm:view>
</pm:page>
</f:view>

Então Cleber, parece que o seu problema é o escopo do Managed Bean; o @ViewScoped só mantém os dados de uma página enquanto um usuário está nela, quando você redireciona o usuário para outra página, esses dados são perdidos mesmo. Faça um teste com @SessionScoped. Agora, tem que ficar atento se o escopo que vc precisará será o Session mesmo, porque nesse escopo pode haver muito consumo de recursos, existem outras opções, como o @ConversationScoped do CDI, etc.

Olá Anderson,

Mudei para SessionScoped, mas mesmo assim não traz as opções escolhidas. Parece que o selection do DataTable é que não esta alimentando o Produto[] produtosSelecionados. Eu estive estudando bem o exemplo do PrimeFaces http://www.primefaces.org/showcase/ui/datatableRowSelectionRadioCheckbox.jsf ele tem um classe CarDataModel que extende ListDataModel e implementa SelectableDataModel isso tem algo haver ?

Pois no meu caso eu pego os dados pela minha DAO que retorna um List.

abraços.