`
runanli
  • 浏览: 44407 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于EJB3的DI一处注意

阅读更多
今天在学习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
1
0
分享到:
评论

相关推荐

    oracle-mysql 两阶段提交例子(ejb3)

    ejb3事务分容器管理事务(CMT)和Bean管理事务(BMT),这里讲述了CMT情况下,两阶段提交例子(tow-phase commit),展示ejb容器为我们做的事情,其实就是ejb容器提供商,已经帮开发者解决了的问题。数据库分别是oracle...

    精通EJB(第二版).part1

    精通EJB的电子书,必须下载part1和part2,请注意

    精通EJB(第二版).part2

    精通EJB的电子书,必须下载part1和part2,请注意

    EJB 3.0无状态会话Bean应用

    该示例使用Eclipse 3.3 Europa IDE、JDK 6.0、GlassFish 2.0翻写的第一个EJB 3.0会话bean应用。注意:必须首先安装GlassFish服务器,可以通过安装NetBean 6.0(M9)来完成安装该服务器,或能单独安装也行,然后在...

    ejb-persistence-ear:学习部署在JEE服务器中的JPA的示例项目

    该项目产生了带有“ jar... 所有相关性,例如“ spec”和任何第3方jars,都应放在ear / lib文件夹中 请仔细观察服务器日志中是否有任何错误 本示例在以下环境中运行 JDK 1.7 Apache Maven 3.0.5 3.1.2.2(内部版本5)

    weblogic平台J2EE调优策略

    第一章 应用程序调优 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代码...

    jboss中文文档

    第 1 章,将涉及 JBoss 4.0.x 应用服务器的下载、安装以及运行。然后,第 2 章大体上 给出 JBoss 应用服务器的目录结构、主要配置文件以及服务。最后,第 3章介绍了本书待使 用的、J2EE Tutorial 中的代码。 接下来...

    JBoss中文文档(pdf版)

    第1章,将涉及JBoss 4.0.x应用服务器的下载、安装以及运行。然后,第2章大体上给出JBoss应用服务器的目录结构、主要配置文件以及服务。最后,第3章介绍了本书待使用的、J2EE Tutorial中的代码。 接下来,第4章将研究...

    Spring In Action中文 第一部分

    你将学习如何使用Spring管理大量的基础设施代码,这样你就可以将注意力集中在真正的问题上——重要的业务需要。 本书内容: ·使用Hibernate、JDO、iBatis、OJB以及JDBC开发持久层; ·声明式事务与事务...

    Spring in Action中文版 清晰pdf part1

    第一部分展示了Spring框架的两个核心概念:反向控制(Inverstion of Control,IoC)和面向切面编程(Aspect-Oriented Programming,AOP),以便读者理解Spring的基础原理,这些基础原理在本书各个章节都会用到。...

    java 面试题 总结

    抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节。抽象包括两个方面,一是过程抽象,二是数据抽象。...

    超级有影响力霸气的Java面试题大全文档

    当客户机第一次调用一个Stateful Session Bean 时,容器必须立即在服务器中创建一个新的Bean实例,并关联到客户机上,以后此客户机调用Stateful Session Bean 的方法时容器会把调用分派到与此客户机相关联的Bean实例...

    Spring in Action中文版 清晰pdf part2

    第一部分展示了Spring框架的两个核心概念:反向控制(Inverstion of Control,IoC)和面向切面编程(Aspect-Oriented Programming,AOP),以便读者理解Spring的基础原理,这些基础原理在本书各个章节都会用到。...

    JAVA面试题最全集

    第一,谈谈final, finally, finalize的区别。 final?修饰符(关键字)如果一个类被声明为final,意味着它不能再派生出新的子类,不能作为父类被继承。因此一个类不能既被声明为 abstract的,又被声明为final的...

    Spring In Action中文 第三部分

    你将学习如何使用Spring管理大量的基础设施代码,这样你就可以将注意力集中在真正的问题上——重要的业务需要。 本书内容: ·使用Hibernate、JDO、iBatis、OJB以及JDBC开发持久层; ·声明式事务与事务管理; ·与...

    Spring In Action中文 第五部分

    你将学习如何使用Spring管理大量的基础设施代码,这样你就可以将注意力集中在真正的问题上——重要的业务需要。 本书内容: ·使用Hibernate、JDO、iBatis、OJB以及JDBC开发持久层; ·声明式事务与事务...

    Spring In Action中文 第二部分

    你将学习如何使用Spring管理大量的基础设施代码,这样你就可以将注意力集中在真正的问题上——重要的业务需要。 本书内容: ·使用Hibernate、JDO、iBatis、OJB以及JDBC开发持久层; ·声明式事务与事务...

    Spring In Action中文 第四部分

    你将学习如何使用Spring管理大量的基础设施代码,这样你就可以将注意力集中在真正的问题上——重要的业务需要。 本书内容: ·使用Hibernate、JDO、iBatis、OJB以及JDBC开发持久层; ·声明式事务与事务...

Global site tag (gtag.js) - Google Analytics