Stateful Beans não mantém estado entre Servlets

5 respostas
Baldao

Olá a todos,

Estou desenvolvendo uma aplicação de teste utilizando EJB 3 no Glassfish, porém esbarrei em uma pequeno problema.

Eu criei um bean stateful:
package sampleear;

import javax.ejb.Remove;
import javax.ejb.Stateful;

@Stateful
public class MyStatefulSessionBean implements StatefulBusinessInterface {

	private String nome;
	
	public void setNome(String nome) {
		this.nome = nome;
	}

	@Remove
	public String getNome() {
		return nome;
	}

}
Seto os dados dele em um servlet:
package sampleear;

import java.io.IOException;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class MyServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@EJB
	StatefulBusinessInterface full;
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = request.getParameter("name");
		
		if (name == null || name.length() == 0) {
			name = "anonymous";
		}
		
		full.setNome(name);
		response.getWriter().write("<a >Quem está logado?</a>");
	}

}
E tento pegar o valor dele em outro servlet:
package sampleear;

import java.io.IOException;

import javax.ejb.EJB;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Logged extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@EJB
	StatefulBusinessInterface full;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.getWriter().write("Usuário logado: " + full.getNome());
		response.getWriter().write("<br />\n<a >voltar</a>");
	}

}

Porém eu recebo a mensagem "Usuário logado: null"... já testei pra ver se o parâmetro name estava errado, mas não.
Acredito que o container está injetando uma nova instância do bean ao invés de utilizar a que tinha sido criada no outro servlet... como resolver isso?

5 Respostas

Jair_Rillo_Junior

No seu Bean, implemente a interface Serializable.
Pode ser que ele esteja perdendo a referencia do valor quando acontece o Passivate/Activate. Com o Serializable deve resolver o problema

Baldao

Não funcionou :?

ChronoTrigger

Tenta colocar o WAR classloader da aplicação como “application” ao invés de “module”

Baldao

Deixa eu ver se eu entendi… vc quer que eu faça o deploy do EAR sem o módulo Web e depois suba esse módulo como uma aplicação separada?

L

Desculpem ressucitar o tópico, mas meu problema é exatamente o mesmo.

Alguém tem idéia?

Criado 1 de setembro de 2008
Ultima resposta 21 de jan. de 2009
Respostas 5
Participantes 4