你想做的绝对是可能的。一些术语说明。
您所拥有的是使用 bean 的远程接口的模块到模块 EJB 注入。
您想要的是使用bean 的本地接口的模块到模块 EJB 注入。
因此,对术语进行一些澄清:
应用程序与模块
当两个 WAR 文件在同一个 EAR 中时,您在规范方面拥有的是一个应用程序和两个模块。
在所有其他情况下(两个 EAR,WAR 不在一个 EAR 中),您有应用程序到应用程序,这更难处理。
意义在于 EAR 创建了一个类加载器,它将成为父类,每个 WAR 都成为 EAR 的一个子类加载器。因此,WAR 文件无法看到彼此的类,但它们可以看到 EAR 中的共享类。这就是我们的解决方案所在——稍后会详细介绍。
远程与本地参考
远程引用是按值传递的(您会获得数据的副本)本地引用是按引用传递的(您提到的“指针”)
请注意,@EJB
在任何一种情况下都使用相同的注释,并且无法判断您可能拥有哪种注释。只有 bean 本身决定通过bean 类或 bean 的接口@Remote
公开哪种类型的引用。@Local
解决方案
因为您有一个 EAR,所以可以将 bean(EJB)从 war 文件中移出并移到一个共享 jar 中,该 jar 位于 EAR 文件的根目录中,紧挨着 WAR 文件。您还必须从 WAR 文件中删除 bean 类及其接口才能使其正常工作。
然后你可以@Remote
将bean的接口更改为@Local
.
如果这样做,您将获得按引用传递的语义,并且两个 WAR 文件可以在没有 CORBA 或类似的重物的情况下共享数据。他们只是传递 java 对象,就像在 java 中传递任何对象一样。
如果您确实确实有应用程序到应用程序的情况,那么您确实需要使用@Remote
传递值语义,这当然要慢很多倍。
如果您还将该 EJB 公开给其他应用程序(例如在服务器之外或在其他 EAR 中),那么您仍然可以通过向 bean annotated 添加第二个接口来做到这一点@Remote
。单个 EJB 可以很容易地公开@Local
接口@Remote
(或我们在规范中称之为视图@WebService
)以及REST 服务视图。