在Restore View Phase中调试JSF java.lang.ClassCastException

时间:2013-09-10 15:40:08

标签: java jsf exception jsf-2 glassfish-3

我想了解一下如何尝试调试JSF异常的原因和/或知道是否有人之前已经看过这种行为。我将使用以下符号来描述问题:

  • 'A' - 表示查看页面A,
  • 'A,CmdLink =&gt; B' - 表示在点击第A页的<h:commandLink>链接
  • 后查看B页
  • 'A,URL =&gt; 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 =&gt; B,CmdLink =&gt; ç

因此显示带有异常的错误页面而不是页面C.但是,以下方案不会生成错误:

  • A,URL =&gt; B,CmdLink =&gt; ç
  • D,CmdLink =&gt; B,CmdLink =&gt; ç

此序列第二次不会生成错误,因此页面C正确显示:

  • A,CmdLink =&gt; B,CmdLink =&gt; ErrorPage(而不是C),URL =&gt; B,CmdLink =&gt; ç

仅当页面A是先前查看过页面B的页面时才会发生例外(并且通过直接在浏览器的地址栏中输入URL未达到页面B)。

页面A是一个复杂页面,包含多个下拉框,RichFaces组件,OpenFaces tabSet,多个数据表,并使用RichFaces AJAX(a4j),而页面B不使用任何这些,只有带命令链接的简单表单。两个页面都使用相同的JSF模板层次结构。 (页面B是第A页选项卡部分中数据表中列出的项目之一的简单编辑页面。)

问题不仅限于页面B是页面A后面的页面。此序列也提供相同的例外,点击页面E中的链接后显示错误页面:

  • A,CmdLink =&gt; E,CmdLink =&gt; ˚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。

对于我如何尝试解决此问题,我们将不胜感激。感谢。

1 个答案:

答案 0 :(得分:0)

我已经能够解决这个问题,因为在页面A(在不同的选项卡中)有另一个链接(称为CmdLinkA2),后面跟着:

  • A,CmdLinkA2 =&gt; B,CmdLink =&gt; ç

不会导致上述错误消息,并且页面C正确显示。比较用于问题<h:commmandLink>的不同支持bean操作方法和页面A上的工作方法(CmdLinkA2),返回到有问题的CmdLink的String最后缺少?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)导致出现错误消息而不是Page C.

但是,由于页面A没有任何要提交的表单数据,如本question中所述,我现在理解不应该使用POST执行页面到页面的导航。