【发布时间】:2013-08-30 12:14:00
【问题描述】:
我使用 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 方法调用的空指针(当我使用调试观看时 sessionManager 不为空)。会话仍然有效,因为我可以直接使用 faces 上下文从会话映射中获取值。
SessionManager 有什么问题?谢谢。
【问题讨论】:
-
我相信你混淆了一些基本概念,导致灾难。我建议仔细阅读以下答案以明确其中之一:stackoverflow.com/a/13012973 和 stackoverflow.com/a/8889612
-
@BalusC 谢谢你的解释!我确实将有状态会话与网络会话混合在一起。
标签: jsf session nullpointerexception cdi session-scope