Как показать сообщение об исключении javax.faces.context.FacesContext внутри предупреждения - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть пункт меню, который вызывает метод. Когда происходит сбой, я хочу, чтобы при вызове ajax отображалось предупреждение с сообщением об исключении.

menu.x html

<rich:panelMenuItem
    id="test"
    name="test"
    label="Ajax call"
    mode="ajax">
    <a4j:ajax
        event="select"
        onerror="alert('error: #{facesContext.messageList[0]}');"
        oncomplete="alert('Success!');"
        listener="#{menuMB.someMethod()}">
    </a4j:ajax>
</rich:panelMenuItem>

MenuMB. java

public void someMethod() throws IOException {
    try {
        // method call which may fail
    } catch (Exception e) {
        FacesContext context = FacesContext.getCurrentInstance();

        FacesMessage mensagem = new FacesMessage(FacesMessage.SEVERITY_ERROR, null, e.getMessage());
        context.addMessage(null, mensagem);

        context.getExternalContext().responseSendError(HttpServletResponse.SC_PRECONDITION_FAILED, e.getMessage());
        context.responseComplete();
    }
}

При выборе пункта меню:

1) Если вызов метода завершается успешно, отображается предупреждение с сообщением «Успех!»

2) Если вызов метода не выполняется, отображается оповещение только с сообщением «ошибка:». Как отобразить сообщение об исключении?

Если я не обработаю исключения при вызове метода, оповещение о событии oncomplete всегда будет отображаться, даже если вызов метода завершится неудачей.


На основе на ответ Махиэль я заметил, что иду в неправильном направлении. Итак, я сделал это:

MenuMB:

private String resultMessage;

public void someMethod() {
    resultMessage = "Any success message";

    try {
        // method call which may fail
    } catch (Exception e) {
        resultMessage = e.getMessage();
    }
}

public String getResultMessage() {
    return resultMessage;
}

menu.x html

<a4j:ajax
    event="select"
    oncomplete="alert('#{menuMB.resultMessage}');"
    listener="#{menuMB.someMethod()}">
</a4j:ajax>

1 Ответ

1 голос
/ 14 февраля 2020

onerror предназначен для обработки ошибок в цикле запроса / ответа AJAX; сбой метода каким-либо образом обычно не является хорошей причиной для прерывания и отправки ошибки

Если вы все еще хотите сделать это таким образом, onerror имеет доступ к переменной с именем event, которая содержит ответ. У вас не будет доступа к FacesMessages.

В противном случае просто установите флаг для результата операции и используйте oncomplete для его обработки

<a4j:ajax
    event="select"
    data="#{menuMB.operationFailed}"
    oncomplete="handle(event.data)"
    listener="#{menuMB.someMethod()}">
</a4j:ajax>

Код JS для handle метод должен быть повторно обработан, чтобы показать сообщение.

...