在Java EE服务器中打包EJB

时间:2010-12-31 19:03:50

标签: java java-ee ejb

我已将EAR中的企业应用程序和WAR中的独立Web应用程序(EAR外部)部署到同一Java EE服务器。

问题是我可以从独立WAR访问EAR中会话bean的本地接口吗?如果可以,我可以使用依赖注入(DI)吗?

2 个答案:

答案 0 :(得分:4)

EJB 3.1规范的第3.2.2节明确指出这不可移植:

  

通过访问企业bean   只需要本地客户端视图   为本地客户提供支持   打包在同一个应用程序中   作为提供的企业bean   本地客户端视图。合规   本规范的实现   可以选择支持访问   企业的本地客户端视图   来自本地客户端的bean打包在   不同的应用。该   配置要求   应用程序间访问本地   客户端视图是特定于供应商的   超出了这个范围   规格。依赖的应用程序   应用程序间访问本地   客户端视图是不可移植的。

一般来说,解决方案至少需要:

  1. 允许EAR和WAR类加载器对同一接口类具有可见性的一些机制。
  2. 从另一个应用程序查找本地接口的一些机制。例如,java:global。

答案 1 :(得分:1)

无论如何,你的问题的答案是

由于ear和war都在同一个JVM中,因此可以使用本地接口。要获取会话bean的实例,您可以使用所述bean的global JNDI name进行JNDI查找或使用@EJB注释上的mappedName属性。这些名称通过以下模式标准化:

java:global[/<app-name>]/<module-name>/<bean-name>[!<fully-qualified-interface-name>]

如果您的耳朵名称是my_app,那么查找将是您的bean是MyBean.java并且其本地接口是com.foo.SomeBeanLocal:

InitialContext ctx = InitialContext();
SomeBeanLocal someBean = (SomeBeanLocal) ctx.lookup("java:global/my_ear/SomeBean/com.foo.SomeBeanLocal");

注射将是:

public SomeManagedClass {

    @EJB(mappedName="java:global/my_ear/SomeBean/com.foo.SomeBeanLocal")
    SomeBeanLocal someBean;
}

然而有两次捕获:

非标准命名

较旧的Java EE实现(例如JBoss AS 5.1,Glassfish 2,Websphere)使用了自己的命名模式。例如。 JBoss AS 5.x将使用:

<app-name>/<bean-name>/local|global

E.g。与前一个示例相同的名称,JBoss AS 5.1中该bean的全局JNDI名称将为:

my_app/MyBean/local

如上所述,其他旧应用程序服务器可能使用其他名称。

启动阶

特别是使用注入时,您必须确保要注入的应用程序在您要注入的应用程序之前已经启动。即在您的情况下,EAR已在独立WAR之前启动。没有标准的机制。你可能只是幸运的是它恰好是你的正确顺序。此订单可能受时间戳,应用程序名称的字母顺序或其他完全不同的影响。

例如,JBoss AS在其许多专有配置文件中使用<depends>标签,这非常适合于此,尽管很难找到您需要依赖的内容(语法可以非常神秘的。)