JSF注入sessioncoped bean的方法调用成为空指针

时间:2013-08-27 16:14:54

标签: jsf session nullpointerexception cdi session-scope

我使用CDI来注释bean。一个名为SessionManager的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方法调用的空指针(当我使用debug来监视时sessionManager不为null)。会话仍然有效,因为我可以直接使用faces context从会话映射中获取值。

SessionManager有什么问题?感谢。

1 个答案:

答案 0 :(得分:1)

这是因为您的有状态会话Bean(EJB)已钝化,并且未重新引入您的会话。如果没有强烈需要使会话范围对象成为会话bean,我只会将其设为SessionScoped托管bean。