今天在学习EJB3的时候发现了一个问题。我所使用的环境是GLASSFISH V3. 实现了一个简单的stateless session bean作为练习如下:
business interface 如下:
@Local
public interface FirstLocalSessionBeanInterface {
public String getHelloMessage();
}
Session bean 如下:
@Stateless
public class FirstLocalSessionBean implements FirstLocalSessionBeanInterface {
public String getHelloMessage() {
return "Hello! This is a Local StateLessSessionBean!";
}
}
然后在同一个ear项目里建立web project来调用该EJB, 我使用JSP调用一个POJO类, 原本打算在该POJO类里直接注入EJB, 代码如下:
public class LocalSessionBeanDelegate {
@EJB
private FirstLocalSessionBeanInterface bean;
public String getEJBMessage(){
return bean.getHelloMessage();
}
我在jsp中调用该类的时候,却总是报bean空指针,这说明@EJB并没有成功的注入该属性。
后来我在java.net的glassfish forum上找到了答案。原来GLASSFISH下的EJB资源注入只支持受容器管理的对象,如EJB,SERVLET,JSF等等。而对于普通POJO是不支持的。要在这些POJO里使用EJB,还得使用传统的JNDI查询方式。
我之后尝试了一下servlet的情形,代码如下:
public class LocalSessionBeanServlet extends HttpServlet {
@EJB
private FirstLocalSessionBeanInterface bean;
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
System.out.println(bean.getHelloMessage());
request.setAttribute("message", bean.getHelloMessage());
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
request.getRequestDispatcher("./localBeanTest.jsp").forward(request, response);
}
/**
* Handles the HTTP <code>POST</code> method.
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
request.getRequestDispatcher("./localBeanTest.jsp").forward(request, response);
}
/**
* Returns a short description of the servlet.
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}
经测试,该代码可以正常的实现EJB注入。
经过该例,发现在GLASSFISH下EJB注入只能在容器管理的组件中实现。我不知道这是否是EE规范中得到规定还是GLASSFISH的实现是这样要求。哪位大虾可以告知一下,不胜感谢。
注:之后查阅了JEE5规范,发现确实在其中有对于这方面的规定。JEE支持DI的组件主要有以下几种:
Servlet: servlets/servlet filters/event listeners
JSP: tag handlers/tag library event listeners
JSF: scoped managed beans
JAX-WS: service endpoints/handlers
EJB; beans/interceptors
Java EE platform: main class (static)/login callback handler
分享到:
相关推荐
ejb3事务分容器管理事务(CMT)和Bean管理事务(BMT),这里讲述了CMT情况下,两阶段提交例子(tow-phase commit),展示ejb容器为我们做的事情,其实就是ejb容器提供商,已经帮开发者解决了的问题。数据库分别是oracle...
精通EJB的电子书,必须下载part1和part2,请注意
精通EJB的电子书,必须下载part1和part2,请注意
该示例使用Eclipse 3.3 Europa IDE、JDK 6.0、GlassFish 2.0翻写的第一个EJB 3.0会话bean应用。注意:必须首先安装GlassFish服务器,可以通过安装NetBean 6.0(M9)来完成安装该服务器,或能单独安装也行,然后在...
该项目产生了带有“ jar... 所有相关性,例如“ spec”和任何第3方jars,都应放在ear / lib文件夹中 请仔细观察服务器日志中是否有任何错误 本示例在以下环境中运行 JDK 1.7 Apache Maven 3.0.5 3.1.2.2(内部版本5)
第一章 应用程序调优 1.1.1 通用代码调优 1.1.2 减小没有必要的操作 1.1.3 使用合适的类型 1.1.4 尽量使用pool,buffer和cache 1.2 JDBC代码调优 1.2.1 严格资源使用 1.2.2 实用技巧 1.2.3 优化SQL语句 1.3 Web代码...
第 1 章,将涉及 JBoss 4.0.x 应用服务器的下载、安装以及运行。然后,第 2 章大体上 给出 JBoss 应用服务器的目录结构、主要配置文件以及服务。最后,第 3章介绍了本书待使 用的、J2EE Tutorial 中的代码。 接下来...
第1章,将涉及JBoss 4.0.x应用服务器的下载、安装以及运行。然后,第2章大体上给出JBoss应用服务器的目录结构、主要配置文件以及服务。最后,第3章介绍了本书待使用的、J2EE Tutorial中的代码。 接下来,第4章将研究...
你将学习如何使用Spring管理大量的基础设施代码,这样你就可以将注意力集中在真正的问题上——重要的业务需要。 本书内容: ·使用Hibernate、JDO、iBatis、OJB以及JDBC开发持久层; ·声明式事务与事务...
第一部分展示了Spring框架的两个核心概念:反向控制(Inverstion of Control,IoC)和面向切面编程(Aspect-Oriented Programming,AOP),以便读者理解Spring的基础原理,这些基础原理在本书各个章节都会用到。...
抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。...
当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例...
第一部分展示了Spring框架的两个核心概念:反向控制(Inverstion of Control,IoC)和面向切面编程(Aspect-Oriented Programming,AOP),以便读者理解Spring的基础原理,这些基础原理在本书各个章节都会用到。...
第一,谈谈final, finally, finalize的区别。 final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的...
你将学习如何使用Spring管理大量的基础设施代码,这样你就可以将注意力集中在真正的问题上——重要的业务需要。 本书内容: ·使用Hibernate、JDO、iBatis、OJB以及JDBC开发持久层; ·声明式事务与事务管理; ·与...
你将学习如何使用Spring管理大量的基础设施代码,这样你就可以将注意力集中在真正的问题上——重要的业务需要。 本书内容: ·使用Hibernate、JDO、iBatis、OJB以及JDBC开发持久层; ·声明式事务与事务...
你将学习如何使用Spring管理大量的基础设施代码,这样你就可以将注意力集中在真正的问题上——重要的业务需要。 本书内容: ·使用Hibernate、JDO、iBatis、OJB以及JDBC开发持久层; ·声明式事务与事务...
你将学习如何使用Spring管理大量的基础设施代码,这样你就可以将注意力集中在真正的问题上——重要的业务需要。 本书内容: ·使用Hibernate、JDO、iBatis、OJB以及JDBC开发持久层; ·声明式事务与事务...