需要帮助理解JNDI和J2EE中的特定ClassCastException

时间:2010-01-28 08:41:46

标签: java-ee jndi classloader weblogic-10.x classcastexception

我部署了企业应用程序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的信息性文本)
  3. 为什么这可能?我假设JNDI查找只返回一个存根到远程对象(我在这一点上是对的吗?),那么为什么接口类的类加载器是不同的呢?

    我期待的那种答案:

    1. 是的,它应该以您体验它的方式发生,因为......
    2. 不,不应该这样,因为如果...那么......,所以你的设置中有一些可疑的东西
    3. 你描述的情况很奇怪,你确定你不会错过某个地方吗?
    4. ...:)
    5. 如果有人能够澄清JNDI和存根如何工作,在哪里进行转换(在存根上的客户端?或者在远程端的原始对象上?)等等,也会很好。

      感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

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

JNDI没有规定对象在树上的存储方式或者如何将其传递给客户端的机制。它只是用于执行操作的API。

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

您可能认为这是一件非常奇怪的事情,但请记住,应用程序之间的谈话并不是JavaEE开发中的常态 - 应用程序应该彼此隔离,只共享系统级资源