我有以下代码:
Object backingBean = facesContextHandler.getBackingBean("UserCredentialsBean");
UserCredentialsBean userCredentBean = (UserCredentialsBean) backingBean;
在我调试它时,我在Eclipse的表达式视图中有以下内容:
backingBean.getClass() - > myPackage.UserCredentialsBean
backingBean instanceOf myPackage.UserCredentialsBean - >假
所以上面的施法失败......
这怎么可能?
更新:其他“症状”:会话超时后我遇到此问题
有什么想法吗?
答案 0 :(得分:4)
有趣的问题。我只能想到两种可能性。
1-空对象。 instanceOf通常对null对象失败。只需确保bean已初始化。
2-级装载机问题。如果两个不同的类加载器加载了同一类的两个对象,则instanceOf将失败。
这不是一个全面的列表,只是我能想到的两件事。
答案 1 :(得分:2)
ClassLoader问题肯定。很可能应用程序已重新部署(因此创建了新的类加载器实例),但旧对象仍然在(磁盘序列化?)会话或内存中。
类名相同,但类加载器实例不同。 Instanceof查看完整的类名和类加载器的相等性。
P.S。这实际上是一个非常普遍的问题。它通常在后台线程被唤醒时才会被发现,只是为了发现应用程序已被重新部署,线程的类加载器已经消失,然后它会将NoClassDefFound或ClassCast抛给那些并不总是意识到这实际上是一个僵尸的开发人员。以前的部署,并试图在他们的代码中找到错误。