我一直在使用 JSF 2.1 mojarra-2.1.20
,并且在我faces-config.xml
的导航案例中进行了如下配置:
<navigation-rule>
<from-view-id>/loggedOut.xhtml</from-view-id>
<navigation-case>
<from-action>#{sessionManager.isLoggedIn}</from-action>
<from-outcome>true</from-outcome>
<to-view-id>/login.xhtml</to-view-id>
<redirect />
</navigation-case>
</navigation-rule>
该动作是使用接缝面viewAction
执行的(类似于 JSF 2.2 新标签)。一切正常。
今天我已经升级到 JSF 2.2 mojarra-2.2.6
,并且浏览到视图loggedOut.xhtml
停止工作。它抛出这个堆栈跟踪:
java.lang.NullPointerException
at com.sun.faces.application.NavigationHandlerImpl.determineViewFromActionOutcome(NavigationHandlerImpl.java:1342)
at com.sun.faces.application.NavigationHandlerImpl.findExactMatch(NavigationHandlerImpl.java:603)
at com.sun.faces.application.NavigationHandlerImpl.getViewId(NavigationHandlerImpl.java:481)
at com.sun.faces.application.NavigationHandlerImpl.getNavigationCase(NavigationHandlerImpl.java:149)
at com.sun.faces.application.NavigationHandlerImpl.getNavigationCase(NavigationHandlerImpl.java:140)
at org.jboss.seam.faces.event.SeamPreNavigationHandler.getNavigationCase(SeamPreNavigationHandler.java:42)
at org.jboss.seam.faces.event.SeamPreNavigationHandler.handleNavigation(SeamPreNavigationHandler.java:57)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:132)
at org.jboss.seam.faces.component.UIViewAction.broadcast(UIViewAction.java:381)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
at javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:931)
at com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:646)
...
我有更多这样的导航,它们都以同样的方式失败。此导航与其他案例和示例之间的唯一区别是from-outcome
value 是 aboolean
而不是 a String
。所以我的问题是:
- 应该
from-outcome
是失败的时候不是String
吗?- 如果是这样,不应该以更“可读”的消息失败吗?
- 否则,是
mojara
错误吗?
- 那么2.1版错了吗?
我知道如何“修复它”:使用 a并检查标签{dummyAction.execute}
中的布尔值。<if>
但我更喜欢执行真正的动作,而不是 2 个不同。