我正在努力实现这个目标:部署一个由简单Servlet组成的WAR,该Servlet负责EJB的注入,并在上面调用一个业务方法。
所有这些都是使用由两个组件组成的maven项目完成的:
1) 示例EJB(pom.xml打包为EJB)2) 示例WAR(Servlet,pom.xml打包为WAR.依赖ejb模块)
我首先要告诉大家,我可以用另一种方式来完成这个练习,将WAR和EJB打包到EAR中,但不能用上面提到的方式。任何人都可以告诉我所使用的应用程序服务器(WebLogic 10.3.3)是否有任何限制?
SimpleServlet(WAR)的代码片段:
public class SimpleServlet extends HttpServlet {
@EJB(mappedName="ejb/SimpleSessionBean")
private SimpleSessionRemote simpleSessionBean;
SimpleSession远程接口(EJB)的代码片段:
@Remote
public interface SimpleSessionRemote
{
String getMessage();
}
SimpleSession Bean类(EJB)的代码片段:
@Stateless(name="SimpleSessionEJB", mappedName="ejb/SimpleSessionBean")
@Remote(SimpleSessionRemote.class)
public class SimpleSession
{
...
EJB没有weblogic-EJB-jar.xml部署描述符,因此它是完全注释的EJB。
在管理控制台中部署WAR之后,在Servlet中直接注入之后,我得到了一个null引用。
怎么了?我忘了走哪一步了?
谨致问候,Pierluigi Salera
===================================
更新:我自己找到了答案
应用服务器不支持EJB 3.1 是不可能的
事实上,我正在使用的WebLogic支持EJB 3.0,如下所述:
http://docs.oracle.com/cd/E14571_01/web.1111/e14529/compatibility.htm
"
WebLogic Server 11g Release 1(10.3.3)与JEE5兼容
"
Java EE 5支持EJB 3.0,如下所述:
http://download.oracle.com/otn-pub/jcp/javaee-5.0-fr-eval-oth-JSpec/javaee-5_0-fr-spec.pdf?AuthParam=1377598866_1774a69dcb8b920f69c0c2623068e247
我还查看了EJB 3.0规范(JSR220),实际上,其中从未明确提到不可能在.war中封装EJB。我认为,不支持这一点的事实是隐含的。
为了提供一个完整的概述,我最后检查了EJB 3.1规范(JSR318),其中明确指出"
企业bean也可以打包在web应用程序模块中(.war)"
,第20章包装。
因此,我们可以得出结论,我的练习的范围是证明,对于不支持EJB 3.1规范的应用程序服务器,在WAR中打包企业Bean是不可能的。
谨致问候,Pierluigi Salera
Servlet 2.5意味着Java EE 5。WAR中的EJB仅在Java EE 6之后才受支持。
您有两个选项:
- 升级至与Java EE 6兼容的容器
- 坚持使用JavaEE5并创建一个EAR而不是WAR。EAR可以由EJB JAR和WAR组成
另请参阅:
- Java EE 6教程-WAR中的EJB
- JavaEE6WAR与EAR中的EJB封装