2016-07-07 11 views
0

Я хочу использовать атрибут onerror в Richfaces для обработки исключений для моих запросов ajax. Для этого я использовалИспользование атрибута onError в Richfaces 4.5

<a4j:commandButton value="OK" 
actionListener="#{aBean.handler()}" 
onerror="showNotification();"> 

и в моем управляемом фасоли:

ABean{ 
    public void handler(){ 
     throw new SomeException("Error to the browser"); 
    } 
} 

Хотя, я бросил исключение в моем обработчике, мой showNotification() никогда не вызывается.

Могу ли я обрабатывать исключения на уровне приложения, используя атрибут onerror? Любые указатели или примеры на эту тему очень ценятся.

+0

Вы имели в виду 'actionListener =" # {aBean.handler} "' без '()'? –

+0

Я не вижу различий в обоих способах # {aBean.handler()} или # {aBean.handler}. Не так ли? –

+0

Да, это в этом случае да, но и посмотрите на конец моего ответа. –

ответ

2

В docs вы можете прочитать этот атрибут onerror работы:

когда результаты запроса с ошибкой

В основном это означает, что запрос должен заканчивается с ошибкой HTTP. Например, HTTP 500, что может означать, что на данный момент сервер недоступен.

Пример его (Java):

public void handler2() throws IOException { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    context.getExternalContext().responseSendError(HttpServletResponse.SC_NOT_FOUND, 
      "404 Page not found!"); 
    context.responseComplete(); 
} 

и a4j:commandButton (XHTML)

<a4j:commandButton value="OK" actionListener="#{bean.handler2}" 
    onerror="console.log('HTTP error');" /> 

В консоли JavaScript вы должны увидеть "Ошибка HTTP".

В любом другом случае с исключениями код oncomplete будет запущен, так как запрос AJAX завершится с успехом. Поэтому, если вы не будете реагировать на исключение в своем коде, вы должны справиться с этим сами. Есть много способов сделать это. Я использую это:

public boolean isNoErrorsOccured() { 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    return ((facesContext.getMaximumSeverity() == null) || 
       (facesContext.getMaximumSeverity() 
        .compareTo(FacesMessage.SEVERITY_INFO) <= 0)); 
} 

И мой oncomplete выглядит следующим образом:

<a4j:commandButton value="OK" execute="@this" actionListener="#{bean.handler1}" 
    oncomplete="if (#{facesHelper.noErrorsOccured}) 
     { console.log('success'); } else { console.log('success and error') }" /> 

и с обработчиком, как это:

public void handler1() { 
    throw new RuntimeException("Error to the browser"); 
} 

В консоли JavaScript вы увидите "успех и ошибок".


BTW. Лучше написать actionListener="#{bean.handler3}" вместо actionListener="#{bean.handler3()}". Причина этого:

public void handler3() { // will work 
    throw new RuntimeException("Error to the browser"); 
} 

// the "real" actionListener with ActionEvent won't work and 
// method not found exception will be thrown 
public void handler3(ActionEvent e) { 
    throw new RuntimeException("Error to the browser"); 
} 
+0

Спасибо Эмиль. Я просто хочу отправить сообщение/данные о деталях исключений из метода обработчика в браузер как часть ответа об ошибке. так что я могу использовать его в атрибуте onerror, таком как console.log (exceptionDetails); Я использовал onerror = "console (event.data)", но я вижу undefined в консоли. –

+0

Рад, что я мог помочь. Но это еще один вопрос. Если вам нравится мой ответ на ваш вопрос _original_, пожалуйста, примите его. Если у вас есть другой вопрос, пожалуйста, спросите его в другой теме. (Вы не можете использовать 'event.data', если вы не установили его первым.) –