处理f:ajax onevent函数中从侦听器方法抛出的异常

时间:2017-03-28 14:43:56

标签: jsf exception-handling

我正在尝试处理从我通过ajax监听器执行的支持bean方法抛出异常(在示例中是故意的)的情况,我想通过显示toastr message来表示它来处理它请求发生错误。我的想法是,当捕获到异常时,我可以在我的bean中设置一个布尔值,然后我就可以将该布尔值传递给onevent函数,以确定要显示的toast消息的类型。

问题是,在运行onevent函数时,传入的布尔值尚未更新,直到ajax至少运行两次(第一次调用时值为false,第二次调用时值为true)。它就好像onevent方法运行它的循环(对于3个阶段),然后THEN更新支持bean布尔值。有没有办法可以使用,或者我根本无法做到这一点。我知道OmniFaces FullAjaxExceptionHandler但我想使用toastr提供的Toast消息以更优雅的方式处理异常。我怎样才能得到它,以便当listenerMethod抛出异常时我可以运行一组不同的javascript来显示正确的信息?

Backing Bean

@Named
@ViewScoped
@Data
public class ExampleBean implements Serializable {
  private static final long serialVersionUID = 1L;

  private Boolean ajaxError;

  public void initialize() {
    log.debug("Initialized Bean");
    ajaxError = false;
  }

  public void listenerMethod() {
    ajaxError = false;
    try {
      // method logic... throw intentional exception for now
      throw new Exception();
    } catch (Exception e) {
      ajaxError = true;
    }
  }

XHTML

<h:commandLink id="ajax-link">
  <h:outputText value="Ajax Link" />
  <f:ajax listener="#{exampleBean.listenerMethod()}"
    render="Ids..."
    onevent="function(data) { ajaxEvent(data, '#{exampleBean.ajaxError}') }" />
</h:commandLink>

的JavaScript

function ajaxEvent = function(data, ajaxError) {
    var status = data.status;
    var title = 'Title';
    var message = 'Description message';

    console.log("AjaxError: " + ajaxError);
    switch (status) {
    case 'begin':
        // logic...
        break;
    case 'complete':
        // other logic...
        break;
    case 'success':
        if (ajaxError === 'true') {
            title = 'Error';
            message = 'An error occurred. Please try again later.';
            toastr['error'](message, title);
        } else {
            title = 'Success';
            message = 'Successful. No Exceptions Thrown.';
            toastr['success'](message, title);
        }
        break;
    }
}

0 个答案:

没有答案