我正在尝试处理从我通过ajax监听器执行的支持bean方法抛出异常(在示例中是故意的)的情况,我想通过显示toastr message来表示它来处理它请求发生错误。我的想法是,当捕获到异常时,我可以在我的bean中设置一个布尔值,然后我就可以将该布尔值传递给onevent函数,以确定要显示的toast消息的类型。
问题是,在运行onevent函数时,传入的布尔值尚未更新,直到ajax至少运行两次(第一次调用时值为false,第二次调用时值为true)。它就好像onevent方法运行它的循环(对于3个阶段),然后THEN更新支持bean布尔值。有没有办法可以使用,或者我根本无法做到这一点。我知道OmniFaces FullAjaxExceptionHandler但我想使用toastr提供的Toast消息以更优雅的方式处理异常。我怎样才能得到它,以便当listenerMethod抛出异常时我可以运行一组不同的javascript来显示正确的信息?
@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;
}
}
<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>
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;
}
}