2

我正在使用 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 方法能处理这个问题吗?

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

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

    }
}
4

1 回答 1

4

至于您的具体问题,您需要为此实现一个自定义,当 ajax 请求中发生异常时,ExceptionHandler基本上执行以下操作:

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. 您可以在此处找到完整的源代码,并此处找到展示示例。

至于您的具体功能要求,当只有用户错误时,我不会抛出异常。这是完全可以恢复的。您需要创建并添加FacesMessageajax 来更新<h:messages>,<p:messages><p:growl>. PrimeFaces 支持autoUpdate="true"在 ajax 请求时自动更新自身。例如

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

<p:messages autoUpdate="true" />

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

于 2012-05-22T16:20:36.233 回答