【问题标题】:How to show javax.faces.context.FacesContext exception message inside an alert如何在警报中显示 javax.faces.context.FacesContext 异常消息
【发布时间】:2020-05-30 08:09:38
【问题描述】:

我有一个调用方法的菜单项。当它失败时,我希望 ajax 调用显示带有异常消息的警报。

menu.xhtml

<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) 如果方法调用成功,它会显示一条警告消息“Success!”

2) 如果方法调用失败,它只显示一条警告消息“错误:”。如何显示异常信息?

如果我不处理方法调用的异常,即使方法调用失败,oncomplete 事件的警报也会一直显示。


根据 Makhiel 的回答,我注意到我走错了方向。所以我这样做了:

菜单MB:

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.xhtml

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

【问题讨论】:

    标签: jsf-2 richfaces


    【解决方案1】:

    onerror 用于处理 AJAX 请求/响应循环中的错误;以某种方式失败的方法通常不是中止和发送错误的好理由

    如果您仍然想这样做,onerror 可以访问包含响应的名为 event 的变量。您将无法访问 FacesMessages。

    否则就给运算结果打个flag,用oncomplete处理

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

    handle 方法的 JS 代码需要重新渲染以显示消息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多