2013-08-27 116 views
0

我使用CDI来注释bean。一个叫豆持有SessionManager与申报logined用户信息:JSF注入sessionscoped bean的方法调用变为空指针

import javax.enterprise.context.SessionScoped; 
import javax.inject.Named; 
import javax.ejb.Stateful; 

@Stateful 
@Named 
@SessionScoped 
public class SessionManagerImpl implements SessionManager, Serializable { 
    ... 
    public UserDto getLoginedUser() { 
     ... 
    } 
} 

,另一种是所谓的DashboardController为:

import javax.enterprise.context.RequestScoped; 
import javax.inject.Named; 
import javax.inject.Inject; 

@Named 
@RequestScoped 
public class DashboardController implements Serializable { 

    @Inject 
    private SessionManager sessionManager; 
    ... 
    public void loadUserInfo() { 
     ... 
     UserDto userDto = sessionManager.getLoginedUser(); 
    } 
} 

我第一次打开一个页面是指DashboardController,它工作得很好。如果我继续使用该网站,它仍然有效。但是,如果我不点击任何页面几分钟,然后回来打开页面,它将显示javassist $$ getLoginedUser方法调用的空指针(当我使用调试进行监视时,sessionManager不为空)。会话仍然有效,因为我可以直接使用faces上下文从会话映射中获取值。

SessionManager有什么问题?谢谢。

+1

我相信你在混合一些基本概念,导致灾难。我建议仔细阅读下面的答案,以获得一个和其他直:http://stackoverflow.com/a/13012973和http://stackoverflow.com/a/8889612/ – BalusC

+0

@BalusC谢谢你的解释!我确实将有状态会话与Web会话混合在一​​起。 –

回答

1

发生这种情况是因为您的有状态会话Bean(EJB)已钝化,并且未重新引入到会话中。如果没有强烈的需求使会话bean的会话作用域对象,我只会将其设置为SessionScoped托管bean。