我是Struts2框架和EJB的新手。我有一个类LoginDAO
,它实现接口checkUser
的LoginDAOLocal
方法。我不明白为什么在以下情况下会看到不同的行为:
如果我按如下方式使用EJB(LoginDAO
是无状态会话bean),则方法调用可以完美地工作而不会出现任何错误。
@EJB
private LoginDAOLocal loginDao;
loginDao.checkUser(userName,password);
如果我按如下方式使用Struts2,它将为方法调用提供Null指针异常。
public class LoginAction extends ActionSupport {
// Getters setters for userName and password)
private LoginDAOLocal loginDao;
loginDao.checkUser(this.userName,this.password);
}
如果我使用一个简单的Java应用程序(没有EJB或Struts2),则该方法调用会产生一个编译时错误,提示未初始化loginDao
public static void main(String[] args) {
LoginDAOLocal loginDao;
loginDao.checkUser(userName,password);
}
有人可以解释为什么这种不同的行为吗?
最佳答案
无需过多关注Java EE规范:EJB由J2EE服务器(JBoss \ Websphere等)中存在的EJB容器管理。容器控制bean的生命周期,并负责根据应用程序的需要创建\销毁bean。
当用完容器(简单的Java应用程序)时,即使将@EJB注释添加到字段成员,也不会初始化Bean,也没有JNDI上下文来获取Bean。