7

我有一个需要配置不同的现有项目。这需要在没有重大代码更改的情况下发生。我实际上希望我只能通过配置以某种方式做到这一点。在过去的 2 到 3 天里,我一直在阅读我能找到的关于这个问题的所有内容。我了解 glassfish 类加载器,以及我可以使用什么。

我有一个当前的示例项目,它有一个 EJB,它定义了一个 @Local 接口。ejb 部署在 ejb-module 内,作为 glassfish 域中的 ejb-module。现在我正在尝试为另一个应用程序找到一种方法,该应用程序作为一个耳朵部署到同一域中,以便能够通过它的本地接口访问该 EJB。

我已阅读文档说这是不可能的。然后我在 StackOverflow 上看到了帖子,网上也有其他人说这是可能的。但是,我找不到实际的解决方案。

通过调查,我意识到@Local EJB 不会将自己注册到 jndi(至少根据日志),如果我使用 glassfish JNDI 浏览器,我也看不到它。所以这对我来说是有道理的,要么是不可能的,要么是 EJB 项目的部署有问题,我需要以某种方式公开它。

@Remote 是一种可能性,如果它可以通过引用进行,并且没有性能开销。但是允许@Local EJB 访问的首选方法确实是最终需要。

有谁知道我需要做什么才能将@Local EJB 暴露给另一个应用程序?或者这显然是不可能的?

我正在使用带有 EJB 3.0 的 Glassfish 2.1

如果 Glassfish 2.1 可以处理 EJB 3.1,如果它提供了这种能力,我愿意转向它,但我怀疑它是否那么容易。

请协助。谢谢你。

我正在添加赏金。要完成赏金,需要在同一个域中运行 2 个 ear 应用程序,其中 A.ear 包含一个 @Local EJB,B.ear 中的应用程序也使用该 EJB。

4

1 回答 1

5

@Peter 给你的链接几乎可以解决你的问题。(链接

解决@Xavier 的问题需要做的一个技巧是为两个耳朵提供相同版本的 common.jar(由相同的类加载器加载)。如果这样做,将不会抛出类转换异常,并且您将能够使用具有本地接口的 ejb。

为此,您需要将 common.jar 放入 glassfish/domains/domain1/lib 文件夹(用您的域名替换 domain1)。这样,这个 jar 将由 Glassfish 的共享类加载器加载。

我用 Eclipse 和 Glassfish 3 做了一个快速测试,结构如下:

package com.example;

JarShared
 - @Local class Server

EarServer
 - EjbServer
    - @Stateless class ServerBean implements Server

EarClient
 - EjbClient
    - @Stateless @LocalBean class ClientBean

从 ClientBean 查找:

InitialContext ic = new InitialContext();
Server server = (Server) ic.
    lookup("java:global/EarServer/EjbServer/ServerBean!com.example.Server");

我没有得到 ClassCastException,我可以从 ServerBean 调用示例方法。

重要笔记:

  • EarServer 和 EarClient 都不应在 lib 文件夹中包含 JarShared,它们应重用位于 domain lib 文件夹中的 JarShared
  • 记得添加 JarShared 后重新启动 Glassfish。
  • 要使两个 ejb 项目都编译,您必须将 JarShared 添加到它们的构建路径中,但仅此而已

如果您有任何疑问,请发表评论。

于 2012-11-30T20:23:41.077 回答