我正在努力实现这个目标:部署一个由一个简单的 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 中直接注入后得到一个空引用。
怎么了?我是不是忘记了什么步骤?
问候, Pierluigi Salera
==================================
更新:我自己找到了答案
App Server 不支持 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,如下所述:
我还检查了 EJB 3.0 规范 (JSR220),实际上,从来没有明确提到不可能将 ejb 打包到 .war 中。我相信,这不受支持的事实是隐含的。
为了提供完整的概述,我最终检查了 EJB 3.1 规范 (JSR318),其中明确指出“
企业 bean 也可以打包在 Web 应用程序模块 (.war) 中”
,第 20 章包装。
因此,我们可以得出结论,我的练习范围是证明使用不支持 EJB 3.1 规范的应用程序服务器不可能将企业 Bean 打包到 WAR 中。
亲切的问候, Pierluigi Salera