我在 XPage 应用程序中偶尔遇到异常:
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
这种行为背后的原因是什么?
Philippe Riand 通过电子邮件解释了这一点:
发生这种类转换是因为同一个类已被 2 个不同的类加载器加载了两次。因此,从 Java 的角度来看,它们是不同的,并且转换失败。
现在,每个 XPage 应用程序都有自己的类加载器。但是每次应用程序发生设计更改(例如通过 Domino Designer)时,都会丢弃该类加载器。这是必需的,因为对 XPage 的更改会生成一个新的 Java 类,然后应加载该新 Java 类而不是以前的类。发生这种情况时,类加载器将被丢弃并创建一个新的。然后,所有与应用程序相关的类都会根据需要重新加载,即使它们没有更改。这是 J2EE 服务器实现的常见行为。
也就是说,如果您的代码在以下范围内缓存对象not当设计发生改变时被丢弃,那么这种情况就很可能发生。例如,当发生设计更改时,applicationScope 和 sessionScope 目前不会被丢弃,这可能会导致此问题。这是一个设计选择,因为放弃范围有时会带来糟糕的开发人员体验,但也有这个缺点。
最后,保存 faces-config.xml 作为解决方法。保存此文件后,整个模块都会从内存中丢弃,包括范围,这解释了它的工作原理。对自定义 Java 类进行更改应该重新加载模块并消除问题。
所以看来将bean(甚至间接)放入sessionScope或applicationScope就是原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)