我一直在使用JSF 2.1 mojarra-2.1.20
,我已經在我的faces-config.xml
導航的情況下配置是這樣的:面孔,配置與-結果不是字符串(布爾)失敗,NullPointerException異常
<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>
該動作使用seam-faces 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
的值爲boolean
而不是String
。所以我的問題是:
- 應該
from-outcome
的失敗,當它不是String
?- 如果是這樣,不應該失敗,更「可讀」的消息?
- 否則,是
mojara
的錯誤?
- 版本2.1錯了嗎?
我知道如何「修復它」:使用{dummyAction.execute}
並檢查<if>
標記中的布爾值。但我更喜歡執行真正的行動,而不是2個不同。