EJB3 - Problemas com Stateful

13 respostas
L

Olá,

Estou fazendo alguns teste com EJB aqui, fiz um sisteminha login, Possuo um SessionBean chamado LoginBean sendo este Stateful, que instancio no servlet de Login e faço o login normalmente. Após o Login vou chama-lo em outro servlet e o objeto Usuario que possuo no SessionBean está null, não sei porque, ele não deveria conter os dados de quando o login foi efetuado?

13 Respostas

L

Depende.

Stateful Session Beans (SFSB) são são a mesma coisa que sessão da web.

O que deve ter acontecido com você é o seguinte: numa requisição você obteve a referência a um SFSB e o descartou, não armazenando na sessão da web. Na outra requisição, você pediu, de novo, um SFSB; e como é uma nova requisição, veio uma nova instância pra você. Você pode até usar um SFSB, mas deve armazenar a referência na sessão para poder utilizá-lo depois.

É claro, é só um chute meu. Pode ser que não seja isso.

L

Hmmm estranho pois se necessito armazenar em uma sessão, então o uso de Stateful não teria sentido, pois posso guardar “qualquer coisa” na sessão, aí Stateful não haveria utilidade.

Jair_Rillo_Junior

leoloko,

Uma coisa que pode estar acontecendo é que quando acontece o activate/passivate do Statefull, ele não deve estar Serializado, ou algum atributo dentro do SessionBean não está serializado

L

Jair Rillo Junior:
leoloko,

Uma coisa que pode estar acontecendo é que quando acontece o activate/passivate do Statefull, ele não deve estar Serializado, ou algum atributo dentro do SessionBean não está serializado

Bom meus session beans implementam a classe Serializable, preciso fazer alguma coisa além disso?

tnaires

Não o Session Bean, mas sim seu objeto Usuario.

L

E como eu resolvo esse problema?

Jair_Rillo_Junior

se você tiver uma classe Usuario, adicione o implements Serializable nela., assim como em todos os outros atributos/objetos

L

Então eu tenho a entidade Usuario, que já está implementando a classe Serializable.

Será que pode ser a forma que eu estou instanciando?

Atualmente eu faço isso

Context ctx = new InitialContext();

	         LoginBeanLocal lbl = (LoginBeanLocal) ctx.lookup("/meu_ear/LoginBean/local");

Outra coisa, tanto as entidades, quanto os sessionbean e os servlets implementam a Serializable.

Porem é obrigatorio ter akela variavel “serialVersionUID = 1L;” e isso influencia em alguma coisa?

L

Então eu tenho a entidade Usuario, que já está implementando a classe Serializable.

Será que pode ser a forma que eu estou instanciando?

Atualmente eu faço isso

Context ctx = new InitialContext();

	         LoginBeanLocal lbl = (LoginBeanLocal) ctx.lookup("/meu_ear/LoginBean/local");

Outra coisa, tanto as entidades, quanto os sessionbean e os servlets implementam a Serializable.

Porem é obrigatorio ter akela variavel “serialVersionUID = 1L;” e isso influencia em alguma coisa?

felipeguerra

leoloko:
Olá,

Estou fazendo alguns teste com EJB aqui, fiz um sisteminha login, Possuo um SessionBean chamado LoginBean sendo este Stateful, que instancio no servlet de Login e faço o login normalmente. Após o Login vou chama-lo em outro servlet e o objeto Usuario que possuo no SessionBean está null, não sei porque, ele não deveria conter os dados de quando o login foi efetuado?


Posta o código ae!

L

Fiz um exemplo bem simples, e ocorre o mesmo problema…

UsuarioBean.java

@Stateful
public class UsuarioBean implements UsuarioBeanLocal, Serializable {
      private String nome;

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

UsuarioBeanLocal

@Local
public interface UsuarioBeanLocal {
      public void setNome(String nome);
      public String getNome();
}

Servlet1

....
try {

    InitialContext ctx = new InitialContext();
    UsuarioBeanLocal ubl = (UsuarioBeanLocal) ctx.lookup("/meuear/UsuarioBean/local");
    ubl.setNome("Leonardo");

} catch(NamingException n) {
    n.printstacktrace();
}
....

Servlet2

....
try {

    InitialContext ctx = new InitialContext();
    UsuarioBeanLocal ubl = (UsuarioBeanLocal) ctx.lookup("/meuear/UsuarioBean/local");
    response.getWriter().writer(ubl.getNome());

} catch(NamingException n) {
    n.printstacktrace();
}
....

Ao acessar o Servlet1, tudo funciona beleza… porém quando vou no Servlet2, acontece um java.lang.NullPointerException ao acessar o ubl.getNome();

Tá difícil a situação aqui… rsrsrs

jgbt

Se vc acessa:

ubl.getNome();

e nome estiver nulo, tem que imprimir null, e não dar exception.
Provavelmente a variavel ubl deve estar nula, o que significa algum erro no lookup.

[]´s

L

jgbt:
Se vc acessa:

ubl.getNome();

e nome estiver nulo, tem que imprimir null, e não dar exception.
Provavelmente a variavel ubl deve estar nula, o que significa algum erro no lookup.

[]´s

Bom fiz o seguinte teste… alterei os servlets para dar um print aki:

Servlet1

...
       try {
			InitialContext ctx = new InitialContext();
			UsuarioBeanLocal ubl = (UsuarioBeanLocal) ctx.lookup("/meuear/UsuarioBean/local");
			
			System.out.println("Servlet1 -> " + ubl);
			
			ubl.setNome("Teste de Testando");
			
		} catch (NamingException e) {
			e.printStackTrace();
		}
...

Aqui ele exibe: 16:08:07,974 INFO [STDOUT] Servlet1 -> UsuarioBean:a5x2s26-5f85r2-fpwxrfn0-1-fpwxscxq-8

Servlet2

...
       try {
			InitialContext ctx = new InitialContext();
			UsuarioBeanLocal ubl = (UsuarioBeanLocal) ctx.lookup("/meuear/UsuarioBean/local");
			
			System.out.println("Servlet2 -> " + ubl);
			
			response.getWriter().write(ubl.getNome());
		} catch (NamingException e) {
			e.printStackTrace();
		}
...

Aqui ele exibe: 16:08:20,776 INFO [STDOUT] Servlet2 -> UsuarioBean:a5x2s26-5f85r2-fpwxrfn0-1-fpwxsmu6-9

Logo na seguencia ele da um exception

16:08:07,974 INFO  [STDOUT] Servlet1 -> UsuarioBean:a5x2s26-5f85r2-fpwxrfn0-1-fp
wxscxq-8
16:08:20,776 INFO  [STDOUT] Servlet2 -> UsuarioBean:a5x2s26-5f85r2-fpwxrfn0-1-fp
wxsmu6-9
16:08:20,776 ERROR [[Servlet2]] Servlet.service() for servlet Servlet2 threw exc
eption
java.lang.NullPointerException
        at org.apache.catalina.connector.CoyoteWriter.write(CoyoteWriter.java:17
1)
        at com.test.servlet.Servlet2.doGet(Servlet2.java:38)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:290)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:206)
        at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFi
lter.java:96)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Appl
icationFilterChain.java:235)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationF
ilterChain.java:206)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperV
alve.java:230)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextV
alve.java:175)
        at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(Securit
yAssociationValve.java:182)
        at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValv
e.java:84)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.j
ava:127)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.j
ava:102)
        at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedC
onnectionValve.java:157)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineVal
ve.java:109)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.jav
a:262)
        at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java
:844)
        at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.proce
ss(Http11Protocol.java:583)
        at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:44
6)
        at java.lang.Thread.run(Unknown Source)

Portanto aparentemente o objeto ubl está ok, sendo somente o atributo em null… já to ficando doido :shock:

Criado 12 de janeiro de 2009
Ultima resposta 13 de jan. de 2009
Respostas 13
Participantes 6