我想了解一下如何尝试调试JSF异常的原因和/或知道是否有人之前已经看过这种行为。我将使用以下符号来描述问题:
<h:commandLink>
链接我得到以下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页中的链接:
因此显示带有异常的错误页面而不是页面C.但是,以下方案不会生成错误:
此序列第二次不会生成错误,因此页面C正确显示:
仅当页面A是先前查看过页面B的页面时才会发生例外(并且通过直接在浏览器的地址栏中输入URL未达到页面B)。
页面A是一个复杂页面,包含多个下拉框,RichFaces组件,OpenFaces tabSet,多个数据表,并使用RichFaces AJAX(a4j),而页面B不使用任何这些,只有带命令链接的简单表单。两个页面都使用相同的JSF模板层次结构。 (页面B是第A页选项卡部分中数据表中列出的项目之一的简单编辑页面。)
问题不仅限于页面B是页面A后面的页面。此序列也提供相同的例外,点击页面E中的链接后显示错误页面:
我尝试添加一个阶段监听器,点击第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。
对于我如何尝试解决此问题,我们将不胜感激。感谢。
答案 0 :(得分:0)
我已经能够解决这个问题,因为在页面A(在不同的选项卡中)有另一个链接(称为CmdLinkA2),后面跟着:
不会导致上述错误消息,并且页面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执行页面到页面的导航。