将EJB3.0 Bean注入JSF2.0 Backing Beans ......不可能吗?

时间:2011-06-08 16:01:11

标签: jsf ejb-3.0 ejb weblogic11g backing-beans

我正在研究Weblogic 11g上的JSF项目,我们的初始设计是调用JSF Backing Beans来调用EJB3.0 bean来执行业务逻辑和数据访问调用。当我尝试将EJB引用注入到支持bean时,@ EJB注释似乎在我的项目中不起作用。每当我点击我正在测试的类时,我的EJB的构造函数永远不会被调用,我最终会得到一个NPE。是否可以将EJB3.0 bean注入JSF支持bean?我是否应该通过JSF Backing bean调用EJB?什么是最佳做法?

5 个答案:

答案 0 :(得分:4)

我有点googled,这确实是Weblogic的一个已知问题。许多类似的主题都没有得到答复。

我发现this blog确认Weblogic中的@EJB仅适用于web.xml定义的资源,而不适用于JSF。该博客还详细介绍了使用ServletContextListener的变通方法,IMO并不比使用JNDI好得多。

我还发现this OTN topic确认当EJB模块包含在子目录中时,Weblogic中的@EJB开始工作(参见2月15日底部的答案) ,2011 5:44 PM)。

答案 1 :(得分:3)

事实证明,在使用JSF和EJB部署任何内容时,这是一个Weblogic特定问题。我在Oracle论坛上发现了这篇文章,解释了如何使用Weblogic 11g在JSF Managed Beans中使用@EJB注入:

EJB3.0 Injection into JSF Managed beans

<强>更新

将轮子旋转太久后,我不得不放弃尝试将EJB注入Weblogic 11g上的JSF ManagedBean。似乎在Tomcat中工作正常。也许EJB3和JSF实现在12G中会更好......

答案 2 :(得分:2)

要使其正常工作,您需要执行以下两个步骤:

  1. 将jsf-2.0.war部署为LIBRARY,您可以找到它/ORACLE_HOME/wlserver_10.3/common/deployable-libraries
  2. enter image description here

    1. 在您的Web项目中,在WEB-INF / weblogic.xml中添加对jsf-2.0.war库的引用

       
          <?xml version="1.0" encoding="UTF-8"?>
      <wls:weblogic-web-app xmlns:wls="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.1/weblogic-web-app.xsd">
      
          <wls:weblogic-version>10.3.3</wls:weblogic-version>
          <wls:context-root>your_context_app</wls:context-root>
      
          <wls:library-ref>
            <wls:library-name>jsf</wls:library-name>
            <wls:specification-version>2.0</wls:specification-version>
            <wls:implementation-version>1.0.0.0_2-0-2</wls:implementation-version>
            <wls:exact-match>true</wls:exact-match>
          </wls:library-ref>                      
      
      </wls:weblogic-web-app>
      
    2. 我已经在weblogic 10.3.3和10.3.5中成功测试了这个。如果这不起作用,请尝试将应用程序部署为EAR文件的一部分。

答案 3 :(得分:1)

所以这就是节拍!有一种简单的方法可以解决这个问题。

  1. 在... wlserver_10.3 \ common \ deployable-libraries下打开jsf-2.0.war

  2. 导航到WEB-INF / lib并在某处保存wls.jsf.di.jar JAR

  3. 将wls.jsf.di.jar JAR放在WAR应用程序的lib文件夹下。

  4. 部署

  5. 现在只需将@EJB添加到@ManagedBean中的属性即可。

答案 4 :(得分:1)

@EJB注释有一个替代方法,以便在JSF ManagedBean Web应用程序中访问本地EJB bean。考虑到您将EJB类和WAR打包在同一个EAR文件中,请执行以下操作:

  1. 配置 ejb-jar.xml 告诉weblogic将EJB bean暴露给外部组件;

    <enterprise-beans>
    <session>
        <ejb-name>MyEJBBean</ejb-name>
        <business-local>com.app.MyEJBBeanLocalInterface</business-local>
        <ejb-class>com.app.MyEJBBeanLocalImpl</ejb-class>
        <session-type>Stateless</session-type>
        <transaction-type>Container</transaction-type>
        <ejb-local-ref>
            <ejb-ref-name>ejb/MyEJBBeanLocal</ejb-ref-name>
            <local>com.app.MyEJBBeanLocalInterface</local>
        </ejb-local-ref>
    </session>
     <enterprise-beans>
    
  2. 通过ejb-link名称在Web应用程序的 web.xml 中插入对EJB的引用。 ejb-ref-name是JSF托管bean可见的名称。

    <ejb-local-ref>
      <ejb-ref-name>ejb/MyEJBBeanLocal</ejb-ref-name>
      <ejb-ref-type>Session</ejb-ref-type>
      <local>com.app.MyEJBBeanLocalInterface</local>
      <ejb-link>MyEJBBean</ejb-link>
    </ejb-local-ref>
    
  3. JSF Managed Bean 中,通过JNDI查找调用EJB Bean,如下所示:

    try {
        Context context = new InitialContext();
        MyEJBBeanLocalInterface myEJBBean = 
        context.lookup("java:comp/env/ejb/MyEJBBeanLocal");
    } catch (NamingException e) {
        e.printStackTrace();
    }

  4. 在我的情况下,我使用的是Weblogic 10.3.6(11g),JSF 2.0和EJB 3.0和JPA(Eclipselink)