0

我想要一些关于如何尝试调试 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。

对于我如何尝试解决此问题的任何有用建议将不胜感激 - 谢谢。

4

1 回答 1

0

我已经能够解决这个问题,因为在页面 A(在不同的选项卡中)上有另一个链接(称为 CmdLinkA2),当它遵循时:

  • A, CmdLinkA2 => B, CmdLink => C

不会导致上述错误信息,并且页面 C 显示正确。比较页面 A 上用于有问题<h:commmandLink>的和工作的 (CmdLinkA2) 的不同支持 bean 操作方法,String返回到有问题的 CmdLink 最终丢失?faces-redirect=true了,即相当于:

1)<h:commandLink value="Next page" action="nextpage.xhtml" />

代替:

2)<h:commandLink value="Next page" action=nextpage.xhtml?faces-redirect=true" />

其中 (1) 导致出现错误消息而不是页面 C。

但是,由于页面 A 没有任何要提交的表单数据,正如在这个问题中所讨论的那样,我现在明白页面到页面的导航根本不应该使用 POST 来执行。

于 2013-09-26T11:46:21.793 回答