15

我在 XPages 应用程序中偶尔遇到异常:

java.lang.ClassCastException: someClass incompatible with someClass.

两个提到的类是相同的,它是用作会话 bean 的类。我无法搜索任何涵盖我的问题的内容。通常对此的解释是设计元素的变化,而不是我的情况。

从那一刻起,XPage 应用程序变得不可用(使用会话 bean someClass 的页面),直到重新启动 http 任务或重新保存 faces-config.xml。

在某些情况下,这与其他异常有关:

com.ibm.jscript.InterpretException: Script interpreter error, line=x, col=y: 
Java method 'method(signature containg someClass)'
on java class 'someOtherClass' not found

这种行为的背后是什么?

4

4 回答 4

16

Philippe Riand 通过电子邮件解释了这一点:

发生这种类转换是因为同一个类已被 2 个不同的类加载器加载了两次。因此,从 Java 的角度来看,它们是不同的,并且转换失败。

现在,每个 XPages 应用程序都有自己的类加载器。但是,每当应用程序发生设计更改时(例如通过 Domino Designer),都会丢弃此类加载器。这是必需的,因为对 XPages 的更改会生成一个新的 Java 类,然后应该加载该类而不是之前的类。发生这种情况时,类加载器将被丢弃并创建一个新的。然后根据需要重新加载所有与应用程序相关的类,即使它们没有更改。这是 J2EE 服务器实现的常见行为。也就是说,如果您的代码正在缓存一个不在范围内的对象当设计更改发生时丢弃,那么这很可能发生。例如,当设计更改发生时,applicationScope 和 sessionScope 当前不会被丢弃,这可能会导致这个问题。这是一个设计选择,因为放弃范围有时会提供糟糕的开发人员体验,但也有这个缺点。

最后,保存 faces-config.xml 作为一种解决方法。保存此文件后,整个模块都会从内存中丢弃,包括范围,这解释了它的工作原理。对自定义 Java 类进行更改应该重新加载模块并消除问题。

因此,似乎将 bean(甚至间接)放入 sessionScope 或 applicationScope 是原因。

于 2011-03-18T13:30:46.963 回答
5

如果同一个类文件在不同的类加载器中加载,那么生成的两个Java类就不是同一个类;不允许您将一个实例传递给期望另一个的函数。通常,如果您遇到此类问题,那是因为您有多个子类加载器可以访问其公共父类加载器不可见的 jar 文件。您可能需要将包含“someclass”的 jar 移动到公共库目录而不是(例如)特定的 webapp 目录。

于 2011-03-18T13:28:37.333 回答
0

只是把我的经验放在这里。

当我遇到这个问题时,我正在使用多个 JVM 的 CAT 环境中运行我的应用程序。因为相同的构建在 ITG 环境中为我成功运行,所以我重新启动了 CAT 上的两个 JVM 并解决了错误。不完全确定是什么原因造成的。

于 2014-07-03T15:17:06.067 回答
0

清理项目也使这个工作!

于 2018-07-19T22:36:50.537 回答