我已将EAR中的企业应用程序和WAR中的独立Web应用程序(EAR外部)部署到同一Java EE服务器。
问题是我可以从独立WAR访问EAR中会话bean的本地接口吗?如果可以,我可以使用依赖注入(DI)吗?
答案 0 :(得分:4)
EJB 3.1规范的第3.2.2节明确指出这不可移植:
通过访问企业bean 只需要本地客户端视图 为本地客户提供支持 打包在同一个应用程序中 作为提供的企业bean 本地客户端视图。合规 本规范的实现 可以选择支持访问 企业的本地客户端视图 来自本地客户端的bean打包在 不同的应用。该 配置要求 应用程序间访问本地 客户端视图是特定于供应商的 超出了这个范围 规格。依赖的应用程序 应用程序间访问本地 客户端视图是不可移植的。
一般来说,解决方案至少需要:
答案 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>
标签,这非常适合于此,尽管很难找到您需要依赖的内容(语法可以非常神秘的。)