我想要一些关于如何尝试调试 JSF 异常的原因和/或知道是否有人以前见过这种行为的建议。我将使用以下符号来描述问题:
- 'A' - 表示查看页面 A,
- 'A, CmdLink => B' - 表示点击页面 A 中的
<h:commandLink>
链接后查看页面 B, - 'A, URL => B' - 表示通过在地址栏中输入其 URL 并在查看页面 A 时按 Enter 来查看页面 B。(因此 JSF 之前仍然生成了页面 A。)
我得到以下信息java.lang.ClassCastException
:
java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.Map
at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(StateManagementStrategyImpl.java:225)
at com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:188)
at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(ViewHandlingStrategy.java:123)
at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(FaceletViewHandlingStrategy.java:452)
at com.sun.faces.application.view.MultiViewHandler.restoreView(MultiViewHandler.java:148)
at javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:303)
at javax.faces.application.ViewHandlerWrapper.restoreView(ViewHandlerWrapper.java:303)
at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:189)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:113)
按以下顺序单击页面 B 中的链接时:
- A, CmdLink => B, CmdLink => C
所以显示异常的错误页面而不是页面C。但是,以下场景不会产生错误:
- A, URL => B, CmdLink => C
- D、CmdLink => B、CmdLink => C
并且这个序列第二次不会产生错误,所以页面C正确显示:
- A、CmdLink => B、CmdLink => ErrorPage(而不是 C)、URL => B、CmdLink => C
仅当页面 A 是页面 B 之前查看的页面(并且通过直接在浏览器的地址栏中输入 URL 未到达页面 B)时,才会发生异常。
页面 A 是一个复杂页面,包含多个下拉框、RichFaces 组件、一个 OpenFaces 选项卡集、多个数据表,并使用 RichFaces AJAX (a4j),而页面 B 不使用任何这些,只有一个带有命令链接的简单表单。两个页面都使用相同的 JSF 模板层次结构。(页面 B 是页面 A 选项卡部分的数据表中列出的项目之一的简单编辑页面。)
该问题不仅限于页面 B 是页面 A 之后的页面。此序列也给出了相同的异常,单击页面 E 中的链接后显示错误页面:
- A, CmdLink => E, CmdLink => F
我尝试添加一个相位监听器,单击页面 B 中的链接后产生以下输出:
INFO: ++++++ START PHASE RESTORE_VIEW 1 ++++++
INFO: ++++++ END PHASE RESTORE_VIEW 1 ++++++
我正在使用 NetBeans 7.2、Glassfish 3.1、RichFaces 4.3.3 Final、OpenFaces 3.0 和 JSF 2.1。
对于我如何尝试解决此问题的任何有用建议将不胜感激 - 谢谢。