【问题标题】:Calling remote EJB3 without interface classes available在没有可用接口类的情况下调用远程 EJB3
【发布时间】:2010-01-03 20:37:12
【问题描述】:

当从另一个 EJB 模块调用远程 EJB3 (Glassfish) 时,通常会有可用的接口,它们作为 JAR 文件包含在内,因此当您进行 JNDI 查找时,一切都会按预期工作。

我有一种情况,EJB3 JNDI 名称是在运行时确定的,并且我尝试以通常的方式访问从 JNDI 检索的 EJB 失败,容器抱怨远程接口类的 ClassNotFound。这对我来说很奇怪,因为所有接口类都扩展了一个父接口,我在调用 EJB 模块中确实依赖于它,即:

IParent ejbRef = (IParent) JndiLocator.getObject("jndinameRemote");

这是否可以通过 EJB3 实现,而无需在我的 JAR 中提供精确的远程 EJB 接口字节码?

博佐

【问题讨论】:

  • 这是一个狂野的镜头(既是因为我的知识有限,也因为描述不够详细。包设置是什么?错误消息是什么?等等),但如果你可以尝试放置全局应用程序服务器(或域)类路径上的接口,并且它以这种方式工作,那么由于不同的类加载器等,您可能会遇到一些问题。
  • 恐怕这就是 JEE 的设计方式,您根本无法创建一个通用的 EJB 客户端来调用您拥有 JNDI 名称和接口父类的任何远程 EJB。这很糟糕,我不知道他们为什么不这样做,这违背了在现有的仅限 JEE 的基础架构中使用 EJB 来实现类似 SOA 的分布式服务的目的。我确定他们想为此使用 Web 服务,但 WS 只是不必要的矫枉过正,他们在应用程序服务器中拥有所有技术来做到这一点。

标签: ejb-3.0


【解决方案1】:

即使我不确定上述设置是什么,我也有类似的需要,即在编译期间不知道客户端 jar 时尝试调用 EJB,事实上我也无法知道部署 EJB 的应用程序服务是什么。

我已经设法通过编写我的自定义类加载器来做到这一点,这里的问题是,反过来尝试调用 EJB 的类必须使用自定义类加载器以及所有必要的 jar 本身加载,即客户端 jar接口和模型以及应用程序服务器特定的客户端 jar。 我将所有上下文属性作为输入传递给我的 Invoker 类,以初始化上下文工厂并调用 bean。

这些是实现这一目标的高级步骤

使用方法invokeEJB创建类EJBInvoker,您可以向它传递几个带有属性的映射,用于准备上下文和Ejb接口、方法、参数类、值和输出类。 使用反射创建 InitialContextFactory 的实例以及 Bean 对象、参数和方法调用。 将上述类添加到单独的 jar 文件中,并使用自定义类加载器调用具有外部项目所需属性的方法。

【讨论】:

    猜你喜欢
    • 2018-05-08
    • 2017-03-01
    • 1970-01-01
    • 2012-11-14
    • 2012-01-21
    • 1970-01-01
    • 2012-07-11
    • 1970-01-01
    • 2018-08-29
    相关资源
    最近更新 更多