Простые лица p: ajaxStatus onerror не вызывается - PullRequest
2 голосов
/ 04 августа 2011

Я пытаюсь обработать исключение ViewExpiredException при вызове ajax с использованием простых символов 2.2.1 на glassfish 3.1.У меня есть ajaxStatus, подобный этому:

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

Вызовы onstart и oncomplete вызываются, как и ожидалось.Я знаю, что 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 просто не вызывается.Я неправильно понимаю, как это должно работать?

1 Ответ

4 голосов
/ 30 декабря 2011

Обработчик onerror не будет вызываться, потому что ViewExpiredException - это не ошибка AJAX, а JSF во время построения представления, которое уже истекло (сеанс истек). Ajax-компонент PrimeFaces не обрабатывает эту ситуацию как ошибку.

В моем решении (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>
...