2011-08-04 22 views
2

我想在glassfish 3.1上使用primefaces 2.2.1在ajax調用上處理ViewExpiredException異常。我有一個像這樣的ajaxStatus:Primefaces p:ajaxStatus onerror不叫

<p:ajaxStatus id="ajaxStatus" 
       onstart="startAjaxDisplay()" 
       onerror="ajaxErrorHandler()" 
       oncomplete="endAjaxDisplay()"/> 

onstart和oncomplete get按預期方式調用。我知道ajaxErrorHandler()的作品,因爲我把它放在oncomplete,而它被調用。它現在正在做的是彈出警報()。我建立了我的試驗,從服務器的響應看起來是這樣的:

<?xml version="1.0" encoding="UTF-8"?> 
<partial-response> 
    <error> 
    <error-name>class javax.faces.application.ViewExpiredException</error-name> 
    <error-message><![CDATA[viewId:/index.xhtml - View /index.xhtml could not be restored.]]></error-message> 
    </error> 
    <changes> 
    <extension primefacesCallbackParam="validationFailed">{"validationFailed":false}</extension> 
    </changes> 
</partial-response> 

這一切如預期,除了使用onerror只是不會被調用。我誤解了這是如何工作的?

+0

如何模擬錯誤?你是否明確拋出'ViewExpiredException'或者你只是假設它應該在某個地方被調用。我問這個是因爲我的想法是,如果在該命名錯誤之前得到一些其他錯誤,並且'ViewExpiredException'是因爲沒有調用該錯誤。 – mico

+0

在這種情況下,我從facesContext.getExternalContext()。getSession()獲取會話,然後在其上調用invalidate()。調用它的方法從不同的瀏覽器窗口調用。我也嘗試過重啓服務器和設置一個非常短的會話超時。 – JOTN

+0

我的'答案'是一個關於你是否100%肯定的說invalidate()方法拋出所謂的'ViewExpiredException'而沒有別的?我的假設是它可能會拋出一些其他的東西,這就是爲什麼你沒有看到它。這是一個想到的假設,而不是經過科學證明的答案。 – mico

回答

4

將不會調用onerror處理程序,因爲ViewExpiredException不是AJAX錯誤,而是在構建已過期視圖(會話已過期)期間的JSF。 PrimeFaces ajax組件不會將此情況作爲錯誤處理。

在我的解決方案(JSF2 + PrimeFaces3)中,我調查了來自服務器的ajax響應並搜索JSF錯誤消息。請參閱下面最簡單的示例:

<h:head> 
    <title>Facelet Title</title> 
    <script language="javasript" type="text/javascript"> 
     function handleAjaxRequest(xhr, status, args){ 
      var xmlDoc = xhr.responseXML; 
      errorNodes = xmlDoc.getElementsByTagName('error-name'); 
      if (errorNodes.length == 0) return; 
      errorName = errorNodes[0].childNodes[0].nodeValue; 
      switch (errorName) { 
       case 'class javax.faces.application.ViewExpiredException': 
        alert ('Session expired, redirecting to login page!'); 

        window.location.href = 'login.xhtml'; 
       break; 
      } 
     }  
    </script> 
</h:head> 

<h:body> 
    <h:form id="frmText"> 
     Enter the value: <p:inputText value="#{bean.text}" /> 
     <p:commandButton value="Enter" update="frmText" 
         oncomplete="handleAjaxRequest(xhr, status, args);"/> 
     <p:separator /> 
     The entered text is: <h:outputText value="#{bean.text}" style="font-weight: 900"/> 
    </h:form> 
</h:body> 
+1

我最終做了基本相同的事情,但使用背面的異常處理程序發送重定向,而不是在客戶端捕獲它。 – JOTN