[Resolvido]Session Bean não mantém estado

Estou com um problema que quando peço para setar um valor resultante de um Result Set usando a propriedade set dos atributos, na classe onde eu atribuo os valores se eu pegar usando o get os valores estão lá, porém quando eu volto para o sessionBean de onde acionei o método, os valores já não estão mais lá, alguém ajuda por favor!

Este é o Bean

package com.example.utils;

import java.util.List;
import java.util.Map;

import javax.faces.context.FacesContext;

import com.example.dao.ClienteDAO;
import com.example.dao.UsuarioDAO;
import com.sun.xml.internal.ws.developer.Stateful;

@Stateful
public class ClienteBean {
	
	private int idCliente;
	private String nome;
	private String endereco;
	private String fone;
	private String bairro;
	private String cidade;
	private String email;
	
	public int getIdCliente() {
		return idCliente;
	}
	public void setIdCliente(int idCliente) {
		this.idCliente = idCliente;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getEndereco() {
		return endereco;
	}
	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}
	public String getFone() {
		return fone;
	}
	public void setFone(String fone) {
		this.fone = fone;
	}
	public String getBairro() {
		return bairro;
	}
	public void setBairro(String bairro) {
		this.bairro = bairro;
	}
	public String getCidade() {
		return cidade;
	}
	public void setCidade(String cidade) {
		this.cidade = cidade;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	
	public String cadastroCliente()
	{
		ClienteDAO clienteDAO = new ClienteDAO();		
		
		return clienteDAO.cadastroCliente(nome, endereco, fone, bairro, cidade, email);
	}
	
	public String alterarCliente()
	{
		ClienteDAO cliente = new ClienteDAO();
		
		return cliente.alterarCliente(idCliente, nome, endereco, fone, bairro, cidade, email);		 
	}
	
	public String preparaAlteraCliente()
	{
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,String> params = fc.getExternalContext().getRequestParameterMap();
		
		String id = params.get("idCliente");		
	
		ClienteDAO clienteDAO = new ClienteDAO();
		
		clienteDAO.listarAlterar(Integer.parseInt(id));		

		System.out.println("ID: " + idCliente);		
		
		return "alteraCliente.jsp";
	}
	
	public String getExcluirCliente()
	{
		FacesContext fc = FacesContext.getCurrentInstance();
		Map<String,String> params = fc.getExternalContext().getRequestParameterMap();
		
		String id = params.get("idCliente");
		
		ClienteDAO clienteDAO = new ClienteDAO();		
		
		return clienteDAO.excluirCliente(Integer.parseInt(id));
	}
//======================================================//		
	public List<ClienteBean> getListar()
	{
		ClienteDAO clienteDAO = new ClienteDAO();
		
		return clienteDAO.listar();
	}
}

E essa é a camada de persistência com o banco. O problema é no método preparaAlteraCliente() e estou tendo o mesmo problema em uma outra classe, mas acredito ser o mesmo erro.

package com.example.dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.example.utils.*;


public class ClienteDAO {		
	
	public String cadastroCliente(String nome, String endereco, String fone, String bairro, String cidade, String email)
	{				
		try
		{			
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/Aula12ex1", "root", "root");	
						
			CallableStatement stm = conn.prepareCall("{call cadastraCliente(?,?,?,?,?,?)}");
						
			stm.setString(1, nome);
			stm.setString(2, endereco);
			stm.setString(3, fone);
			stm.setString(4, bairro);
			stm.setString(5, cidade);
			stm.setString(6, email);			
			
			stm.executeQuery();		
			
			return "sucesso";
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			return "erro";
		} catch (SQLException e) {	
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			return "erro";
		}		
	}	
	
	public String alterarCliente(int idCliente, String nome, String endereco, String fone, String bairro, String cidade, String email)
	{				
		try
		{			
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/Aula12ex1", "root", "root");	
						
			CallableStatement stm = conn.prepareCall("{call alteraCliente(?,?,?,?,?,?,?)}");
						
			stm.setString(1, nome);
			stm.setString(2, endereco);
			stm.setString(3, fone);
			stm.setString(4, bairro);
			stm.setString(5, cidade);
			stm.setString(6, email);	
			stm.setInt(7, idCliente);	
			
			stm.executeQuery();		
			
			return "sucesso";
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			return "erro";
		} catch (SQLException e) {	
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			return "erro";
		}		
	}	
	
	public String excluirCliente(int idCliente)
	{				
		try
		{			
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/Aula12ex1", "root", "root");	
						
			CallableStatement stm = conn.prepareCall("{call excluiCliente(?)}");
						
			stm.setInt(1, idCliente);				
			
			stm.executeQuery();		
			
			return "sucesso";
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			return "erro";
		} catch (SQLException e) {	
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			return "erro";
		}		
	}		
	
	public List<ClienteBean> listar()
	{
		try
		{
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/Aula12ex1", "root", "root");	
								
			CallableStatement stm = conn.prepareCall("{call consultaCliente(?)}");
			stm.setString(1, "");			
			
			ResultSet rs = stm.executeQuery();	
			
			List<ClienteBean> listCliente = new ArrayList<ClienteBean>();			
			
			while(rs.next())
			{		
				ClienteBean clienteBean = new ClienteBean();				
				
				clienteBean.setIdCliente(rs.getInt("idCliente"));
				clienteBean.setNome(rs.getString("nomeCliente"));
				clienteBean.setEndereco(rs.getString("endereco"));
				clienteBean.setFone(rs.getString("fone"));
				clienteBean.setBairro(rs.getString("bairro"));
				clienteBean.setCidade(rs.getString("cidade"));
				clienteBean.setEmail(rs.getString("email"));
				listCliente.add(clienteBean);		
			}
			
			for (@SuppressWarnings("rawtypes")
			Iterator iterator = listCliente.iterator(); iterator.hasNext(); ) {  
				ClienteBean obj = (ClienteBean) iterator.next();  			      
			}  
			
			return listCliente;
			
		}catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			//return "erro";
		} catch (SQLException e) {	
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			//return "erro";
		}
		return null;
	}

	public String listarAlterar(int idCliente)
	{
		try
		{
			Class.forName("com.mysql.jdbc.Driver");
			Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/Aula12ex1", "root", "root");	
								
			CallableStatement stm = conn.prepareCall("{call consultaAlterarCliente(?)}");
			stm.setInt(1, idCliente);			
			
			ResultSet rs = stm.executeQuery();	
			
			while(rs.next())
			{
				ClienteBean clienteBean = new ClienteBean();				
					
				clienteBean.setIdCliente(rs.getInt("idCliente"));
				clienteBean.setNome(rs.getString("nomeCliente"));
				clienteBean.setEndereco(rs.getString("endereco"));
				clienteBean.setFone(rs.getString("fone"));
				clienteBean.setBairro(rs.getString("bairro"));
				clienteBean.setCidade(rs.getString("cidade"));
				clienteBean.setEmail(rs.getString("email"));				
			}				
			
		}catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			//return "erro";
		} catch (SQLException e) {	
			// TODO Auto-generated catch block
			e.printStackTrace();
			
			//return "erro";
		}
		return null;		
	}
}

Vc tem que manter sempre a referência do statefull. Geralmente é colocada dentro de um httpsession.

E como eu faria isso adaptando-o ao meu código?

Você tem que fazer isso no servlet/action/managed bean. Seja lá oq for que você estiver utilizando. httpSession.setAtributo("meuStateful", meuBean);

Então, estou usando JSF 2.0. O problema é o seguinte, eu faço uma consulta no banco e retorno em uma tabela os clientes cadastrados com dois botões, um alterar e o outro excluir.

Quando eu clico no alterar eu preciso mandar os dados do cliente para uma página jsp onde irei poder fazer a alteração dos dados eu aciono essa classe ClienteBean, mas agora eu n sei onde colocarei esse HttpSession. Quando estava usando servlets eu usava o HttpSession e n tinha problema mas usando JSF eu to perdido e nem sei onde colocar.

[quote=silver00]Então, estou usando JSF 2.0. O problema é o seguinte, eu faço uma consulta no banco e retorno em uma tabela os clientes cadastrados com dois botões, um alterar e o outro excluir.

Quando eu clico no alterar eu preciso mandar os dados do cliente para uma página jsp onde irei poder fazer a alteração dos dados eu aciono essa classe ClienteBean, mas agora eu n sei onde colocarei esse HttpSession. Quando estava usando servlets eu usava o HttpSession e n tinha problema mas usando JSF eu to perdido e nem sei onde colocar.[/quote]JSF basta utilizar seu MB como @SessionScoped ou colocar no HttpSession.

Não deu certo coloquei o @SessionScoped no inicio da classe e depois o

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

no metodo que chamei mas n deu certo…=/

Problema resolvido usando:

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

Obrigado!

[quote=silver00]Não deu certo coloquei o @SessionScoped no inicio da classe e depois o

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

no metodo que chamei mas n deu certo…=/[/quote]
Engraçado, quando eu preciso usar esta combinação, apenas coloco o @SessionScoped, do pacote javax.faces.bean e ele funciona adequadamente. Não preciso de nada além disso.