2011-01-25 92 views
8

我們有一個使用JSF2和Spring的應用程序。應用程序在部署時工作正常。但是,如果我經歷了以下步驟,會發生這種情況:java.lang.IllegalArgumentException:null source

  1. 打開應用程序的登錄頁面。
  2. 在服務器上重新部署應用程序。
  3. 嘗試使用先前打開登錄頁面登錄,並顯示以下異常:

    javax.servlet.ServletException: null source 
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:321) 
        at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237) 
        at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167) 
    
    root cause 
    
    java.lang.IllegalArgumentException: null source 
        at java.util.EventObject.<init>(EventObject.java:38) 
        at javax.faces.event.SystemEvent.<init>(SystemEvent.java:67) 
        at javax.faces.event.ComponentSystemEvent.<init>(ComponentSystemEvent.java:69) 
        at javax.faces.event.PostRestoreStateEvent.<init>(PostRestoreStateEvent.java:69) 
        at com.sun.faces.lifecycle.RestoreViewPhase.deliverPostRestoreStateEvent(RestoreViewPhase.java:256) 
        at com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:245) 
        at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:97) 
        at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:107) 
        at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:114) 
        at javax.faces.webapp.FacesServlet.service(FacesServlet.java:308) 
    

如果我點擊第一個登錄頁面,然後輸入登錄信息的應用程序不破。這隻會發生,如果我嘗試使用新加載的登錄頁面與新部署的應用程序。

任何人都知道答案?

回答

13

這個應該是ViewExpiredException。這是一個開始在Mojarra 2.0.3中體現出來的bug,並且已經在Mojarra 2.1.0中修復了。另請參閱issue 1762(請注意,Mojarra 2.1.0 doesn't在Tomcat/Jetty上工作,至少使用Mojarra 2.1.1)。

基本上,當Mojarra無法構建或恢復視圖時,它通常會拋出一個特定的異常,但由於此錯誤,後面代碼中錯誤地預期了有效視圖,從而導致IllegalArgumentException: null source。可能的real原因可能是該視圖包含一個簡單的XML語法錯誤,例如缺少標籤或屬性值損壞,對此,Mojarra通常會拋出一個帶有非常詳細的消息的行號和位置等的FaceletException等。

要防止ViewExpiredException,您必須在執行任何操作之前通過GET請求刷新頁面。如果你使用的是一個Mojarra版本,在這個bug沒有顯示的地方(例如2.0.2或者更早的版本,或者2.1.0或者更新的版本),那麼你可以在web.xml<error-page>上適當地處理它,並且提供一個自定義的錯誤其中向終端用戶通知會話已經到期,以及到初始請求URI的鏈接。

+0

我現在有完全相同的問題,我會更新我的mojarra版本,看看我是否得到類似的問題。 – Rachel 2012-03-12 19:59:31

4

只要javax.faces.PARTIAL_STATE_SAVING設置爲您會收到的java .lang.IllegalArgumentException。如果你設置了javax.faces.PARTIAL_STATE_SAVINGtrue(你知道你在做什麼),你會得到「好老」javax.faces.application.ViewExpiredException返回

-1

在我的情況下,原來我有一個jstl調用的xhtml文件中缺少結束標記。我正在使用選擇標籤和其中一個標籤之間選擇沒有結束標籤