我部署了一个企业应用程序 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 {
...
}
会发生什么:
- 如果包含接口类的 jar 在系统类路径上,则第 2 行执行正常
- 如果接口类不在系统类路径上,而是与应用程序单独打包,则第 2 行将引发 ClassCastException(其中包含 o 是 ConnectionFactoryImpl 的信息文本)
为什么这可能?我假设 JNDI 查找只返回一个到远程对象的存根(我在这一点上是对的吗?),那么如果接口类的类加载器不同,为什么这很重要?
我期望的那种答案:
- 是的,它应该以你体验的方式发生,因为......
- 不,它不应该以这种方式发生,因为如果……那么……,所以你的设置有问题
- 你描述的情况很奇怪,你确定你没有漏掉某个地方吗?
- ... :)
如果有人能阐明 JNDI 和存根是如何工作的,转换发生在哪里(存根的客户端?还是远程端的原始对象?)等等,那也很好。
谢谢你的帮助!