JSF - Dúvida com arrayList em uma sessão

Seguinte, na minha aplicação existe um JSCOOKMENU em que eu chamo uma ação {tarifasMB.ExibirProdutos}, em que tarifasMB possui escopo SESSION (não consigo usar o REQUEST de jeito nenhum).

Segue parte do código do managed bean:

public class TarifasMB {
........
........
private List<SelectItem> listaProdutos = new ArrayList<SelectItem>();

public String ExibirProdutos() {
		
this.listaProdutos.clear(); 
this.setMensagem("");
		
FacesContext context = FacesContext.getCurrentInstance();
LoginMB usuario = (LoginMB) context.getExternalContext().getSessionMap().get("loginMB");

List<SisUniProdutos> uni = SisUniProdutosDAO.getInstance().findSisUniProdutos(usuario.getId());
		
if(uni != null) {
      this.setNenhumItem(false);
      for(int i=0; i < uni.size(); ++i) {
          this.listaProdutos.add(new SelectItem(uni.get(i).getId(), uni.get(i).getNomeproduto());
       }
}

else {	
      this.setNenhumItem(true);
      this.setMensagem("NENHUM PRODUTO ENCONTRADO.");
}
		
return "telaEscolheProduto";
			
}

E o listaProdutos é listado dentro de um selectItems na pagina.jsp:

<t:selectOneMenu id=“escolha” value="#{tarifasMB.idProduto}">
<f:selectItem itemLabel="------Selecione------" itemValue=""/>
<f:selectItems value="#{tarifasMB.listaProdutos}" />
</t:selectOneMenu>

O que acontece é que, quando eu abro a página.jsp pela primeira vez, os produtos são listados certos. Se eu fizer alguma alteração no banco de dados por exemplo, ele lista certo os produtos nas primeiras vezes, mas, depois de um certo momento, ele passa a exibir na CAIXA DE SELEÇÃO os produtos que estavam anteriormente, ou seja, ele começa a pegar a lista que está armazenada na SESSÃO.

E isso acontece em todas as minhas páginas em que eu preciso armazenar um arrayList na sessão (na verdade como o escopo é session todos os campos ficam na sessão). Se alguém puder me ajudar vou agradecer muito, pois não sei pq essa disgraça do nada resolve pegar dados antigos e NÃO ATUALIZA os dados da sessão com os novos valores do BD.

[/code]

eu tive o mesmo problema danielufv

o jsf armazena os seus session forms como atributos na sessão, utilizando o nome declarado.

ex:

&lt;managed-bean&gt;
   &lt;managed-bean-name&gt;formAbacaxi&lt;/managed-bean-name&gt;
   &lt;managed-bean-class&gt;br.com.xxx.FormAbacaxi&lt;/managed-bean-class&gt;
   &lt;managed-bean-scope&gt;session&lt;/managed-bean-scope&gt;
&lt;/managed-bean&gt;

qdo vc utilizar este form, o jsf vai armazená-lo como um atributo na sessão com o nome “formAbacaxi”

o que eu fiz foi o seguinte: eu armazeno na sessão um atributo que contém o nome do último form visitado (dessa forma eu posso remover ele para na próxima visita, e carregar novamente)…

vc pode, no construtor de um FormGenerico do qual todos os forms extendem, remover da sessão o último form utilizado, e atualizar o nome do último form visitado para este próprio (que está sendo utilizado agora):

public FormGenerico&#40;&#41;&#123;
		String ultimoForm = &#40;String&#41;session.getAttribute&#40;&quot;ULTIMO_FORM&quot;&#41;;
		if&#40;ultimoForm!=null&#41;&#123;
			getSession&#40;&#41;.removeAttribute&#40;ultimoForm&#41;;
		&#125;
		getSession&#40;&#41;.setAttribute&#40;&quot;ULTIMO_FORM&quot;,getFormName&#40;&#41;&#41;;
&#125;

para isso, basta utilizar este construtor em um form genérico, e implementar nos seus forms um método chamado getFormName() que retorna o nome deles, como “formAbacaxi” no exemplo…

é uma solução… vc pode criar outras
até