В 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");
}
Вы имели в виду 'actionListener =" # {aBean.handler} "' без '()'? –
Я не вижу различий в обоих способах # {aBean.handler()} или # {aBean.handler}. Не так ли? –
Да, это в этом случае да, но и посмотрите на конец моего ответа. –