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

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

ConnectionFactory是一个接口(interface),定义为:
public interface ConnectionFactory
    extends java.io.Serializable, javax.resource.Referenceable {
    ...
}

发生的是:
  • 如果包含接口(interface)类的jar在系统类路径上,则执行第2行就可以了
  • 如果接口(interface)类不在系统类路径上,而是与应用程序分开包装,则第2行会引发ClassCastException(其提示性文本是o是ConnectionFactoryImpl)。

  • 为什么会这样呢?我假设JNDI查找只返回一个存根到远程对象(我现在是对的吗?),那么如果接口(interface)类的类加载器不同,那为什么有关系呢?

    我期望的答案是:
  • 是的,它应该按照您的体验发生,因为...
  • 不,这种方式不应该发生,因为如果...那么...,则您的设置中有一些可疑的东西
  • 您描述的情况非常奇怪,您确定您不会在某个地方遗漏某些地方吗?
  • ... :)

  • 如果有人可以澄清JNDI和存根的工作方式,强制转换在哪里发生(在存根的客户端上还是在远程的原始对象上)等,也将是很好的。

    谢谢你的帮助!

    最佳答案

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

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

    如果两个应用程序都在同一个JVM中(如此处所示),则Weblogic很可能只是将对象直接传递给客户端应用程序。没有存根,并且是“远程端”。由于该对象实现的类型对于客户端应用程序是不可见的(请记住,类型标识由类名称以及从其加载的类加载器定义)。

    您可能会认为这是一件奇怪的事情,但是请记住,像这样相互交谈的应用程序并不是JavaEE开发中的规范-应该将这些应用程序彼此隔离,仅共享系统级资源。

    关于jakarta-ee - 需要帮助来了解JNDI和J2EE中的特定ClassCastException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2153216/

    10-11 22:35