我是Struts2框架和EJB的新手。我有一个类LoginDAO
,它实现了接口checkUser
的{{1}}方法。我不明白为什么我会看到以下情况的不同行为:
如果我使用EJB(LoginDAOLocal
是无状态会话bean),如下所示,方法调用完美无误地运行。
LoginDAO
如果我按如下方式使用Struts2,它会为方法调用提供Null指针异常。
@EJB
private LoginDAOLocal loginDao;
loginDao.checkUser(userName,password);
如果我使用简单的Java应用程序(没有EJB或Struts2),方法调用会产生编译时错误,说明loginDao未初始化
public class LoginAction extends ActionSupport {
// Getters setters for userName and password)
private LoginDAOLocal loginDao;
loginDao.checkUser(this.userName,this.password);
}
有人可以解释为什么会出现这种不同的行为吗?
答案 0 :(得分:1)
不要过多地了解Java EE规范:EJB由J2EE服务器(JBoss \ Websphere等)中存在的EJB容器管理。容器控制bean生命周期,负责根据应用程序需要创建\销毁bean。
当用完容器(简单的java应用程序)时,即使将@EJB注释添加到字段成员,也不会初始化bean并且没有JNDI上下文来获取bean。
答案 1 :(得分:1)
我们可以说有两种方法可以使用容器(由容器管理)或另一个组件(由servlet,监听器或过滤器管理)来管理bean。
使用容器管理的组件,容器会注入引用。 e.g:
@WebServlet("/test")
public class MyServlet extends HttpServlet {
@Resource(lookup = "jdbc/TestDS")
private DataSource testDS;
}
相比之下,由bean管理的组件,例如:
@Namespace("/User")
@ResultPath(value = "/")
@Result(name = "success", location = "pages/login.jsp")
public class LoginAction extends ActionSupport {
}
由过滤器org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
管理。后者应负责执行dependency injection。例如,Spring负责注入所有必要的依赖项。