3

我部署了一个企业应用程序 A 和 B(在 WLS 10.0 中)。A 是“框架”,B 是客户端应用程序。客户端发出以下调用:

Object o = ctx.lookup(jndiName); // line 1
cf = (ConnectionFactory) o; // line 2

ConnectionFactory 是一个接口,定义为:

public interface ConnectionFactory 
    extends java.io.Serializable, javax.resource.Referenceable {
    ...
}

会发生什么:

  1. 如果包含接口类的 jar 在系统类路径上,则第 2 行执行正常
  2. 如果接口类不在系统类路径上,而是与应用程序单独打包,则第 2 行将引发 ClassCastException(其中包含 o 是 ConnectionFactoryImpl 的信息文本)

为什么这可能?我假设 JNDI 查找只返回一个到远程对象的存根(我在这一点上是对的吗?),那么如果接口类的类加载器不同,为什么这很重要?

我期望的那种答案:

  1. 是的,它应该以你体验的方式发生,因为......
  2. 不,它不应该以这种方式发生,因为如果……那么……,所以你的设置有问题
  3. 你描述的情况很奇怪,你确定你没有漏掉某个地方吗?
  4. ... :)

如果有人能阐明 JNDI 和存根是如何工作的,转换发生在哪里(存根的客户端?还是远程端的原始对象?)等等,那也很好。

谢谢你的帮助!

4

1 回答 1

2

遗憾的是,答案是(1)。

JNDI 没有规定对象如何存储在树上或如何交付给客户端的机制。它只是一个用于执行操作的 API。

如果两个应用程序都在同一个 JVM 中,就像它们在这里一样,那么 Weblogic 很可能只是将对象直接交给客户端应用程序。没有存根和“远程端”。由于该对象实现的类型对客户端应用程序不可见(请记住,类型标识由类名定义,以及加载它的类加载器)。

您可能会认为这是一件奇怪的事情,但请记住,应用程序之间以这种方式进行对话并不是 JavaEE 开发的常态——应用程序应该彼此隔离,只共享系统级资源。

于 2010-01-28T08:50:33.363 回答