将服务器端消息/异常与AJAX请求链接

时间:2012-05-22 09:30:00

标签: ajax jsf-2 exception-handling glassfish primefaces

我正在使用Primefaces进行ajax提交,但我无法将我的服务器端消息与我的ajax请求相关联。 假设我有一个调用动作的按钮。 在我的托管bean中,我是否需要引发异常?如何将此消息传递到我的ajax请求

public void checkout(ActionEvent event){
    if(expression){
        throw new CustomException("Account balance is not enough!");
    }
}

public class CustomException extends RuntimeException { 
    public CustomException(String message) {
        super(message);
    }
}

我该如何处理这个案子?我的onerror javascript方法能够处理这个吗?

此外,在一种情况下,假设DB已关闭,那么我该如何处理异常呢?我是否已访问该错误消息 在我的javascript函数中?

public void checkout(ActionEvent event){
    try{
        //DB is down
        if(expression){
            throw new CustomException("Account balance is not enough!");
        }
    }catch(Exception e){

    }
}

1 个答案:

答案 0 :(得分:4)

至于你的具体问题,你需要为此实现一个自定义ExceptionHandler,当ajax请求中发生异常时基本以下内容:

String errorPageLocation = "/WEB-INF/errorpages/500.xhtml";
context.setViewRoot(context.getApplication().getViewHandler().createView(context, errorPageLocation));
context.getPartialViewContext().setRenderAll(true);
context.renderResponse();

如果您想将web.xml错误页面考虑在内,这并非完全无关紧要。您需要解析整个web.xml以查找错误页面位置。 OmniFaces实用程序库具有这样的异常处理程序FullAjaxExceptionHandler。您可以找到完整的源代码here和展示示例here

至于你的具体功能要求,当出现用户错误时我不会抛出异常。这是完全可以恢复的。您需要创建并添加FacesMessage并使用ajax更新<h:messages><p:messages><p:growl>。 PrimeFaces支持autoUpdate="true",它会在ajax请求上自动更新自己。 E.g。

context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Insufficient balance", null));

<p:messages autoUpdate="true" />

抛出异常仅在不可恢复的情况下才有意义,例如当数据库关闭时。请注意,您通常不会自己抛出这样的异常。在JPA的情况下,它已经被抛出为PersistenceException,而你反过来不应该在JSF托管bean中捕获,但只是放手。