我正在研究Weblogic 11g上的JSF项目,我们的初始设计是调用JSF Backing Beans来调用EJB3.0 bean来执行业务逻辑和数据访问调用。当我尝试将EJB引用注入到支持bean时,@ EJB注释似乎在我的项目中不起作用。每当我点击我正在测试的类时,我的EJB的构造函数永远不会被调用,我最终会得到一个NPE。是否可以将EJB3.0 bean注入JSF支持bean?我是否应该通过JSF Backing bean调用EJB?什么是最佳做法?
答案 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)
要使其正常工作,您需要执行以下两个步骤:
在您的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>
我已经在weblogic 10.3.3和10.3.5中成功测试了这个。如果这不起作用,请尝试将应用程序部署为EAR文件的一部分。
答案 3 :(得分:1)
所以这就是节拍!有一种简单的方法可以解决这个问题。
在... wlserver_10.3 \ common \ deployable-libraries下打开jsf-2.0.war
导航到WEB-INF / lib并在某处保存wls.jsf.di.jar JAR
将wls.jsf.di.jar JAR放在WAR应用程序的lib文件夹下。
部署
现在只需将@EJB添加到@ManagedBean中的属性即可。
答案 4 :(得分:1)
@EJB注释有一个替代方法,以便在JSF ManagedBean Web应用程序中访问本地EJB bean。考虑到您将EJB类和WAR打包在同一个EAR文件中,请执行以下操作:
配置 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>
通过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>
在 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();
}
在我的情况下,我使用的是Weblogic 10.3.6(11g),JSF 2.0和EJB 3.0和JPA(Eclipselink)