Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JSF ajax请求中的异常处理_Ajax_Jsf_Exception Handling_Jsf 2.2 - Fatal编程技术网

JSF ajax请求中的异常处理

JSF ajax请求中的异常处理,ajax,jsf,exception-handling,jsf-2.2,Ajax,Jsf,Exception Handling,Jsf 2.2,在处理JSF ajax请求时引发异常时,如何处理异常并访问堆栈跟踪?现在,当JSF项目阶段设置为开发时,我只在JavaScript警报中获得异常类名和消息。更糟糕的是,当JSF项目阶段设置为生产阶段时,没有任何视觉反馈,服务器日志也没有显示有关异常的任何信息 如果这是相关的,我在Netbeans中使用GlassFish。这个问题在其他方面是已知的,并得到了充实 默认情况下,当JSF ajax请求期间发生异常时,如果操作是否成功执行,最终用户将无法获得任何形式的反馈。在Mojarra中,只有当项目

在处理JSF ajax请求时引发异常时,如何处理异常并访问堆栈跟踪?现在,当JSF项目阶段设置为开发时,我只在JavaScript警报中获得异常类名和消息。更糟糕的是,当JSF项目阶段设置为生产阶段时,没有任何视觉反馈,服务器日志也没有显示有关异常的任何信息


如果这是相关的,我在Netbeans中使用GlassFish。

这个问题在其他方面是已知的,并得到了充实

默认情况下,当JSF ajax请求期间发生异常时,如果操作是否成功执行,最终用户将无法获得任何形式的反馈。在Mojarra中,只有当项目阶段设置为“开发”时,最终用户才会看到只有异常类型和消息的纯JavaScript警报

技术原因是异步请求(读:Ajax请求)默认情况下不会返回同步响应(读:整页)。相反,它们返回一些小指令和部分内容,说明如何更新已打开页面的HTMLDOM树。当发生异常时,这些指令基本上完全不存在。相反,会发回一些错误信息。您通常可以在Ajax组件的
onerror
属性中处理它们,例如显示警报或执行
窗口。位置
更改。至少,这是JSF对您的期望

为了捕获并记录异常,并有选择地更改整个响应,您基本上需要创建一个自定义的。不幸的是,标准JSF没有提供一个默认的开箱即用(至少不是一个合理的)。在自定义异常处理程序中,您将能够获得导致所有问题的
异常
实例

以下是一个启动示例:

public class YourExceptionHandler extends ExceptionHandlerWrapper {

    private ExceptionHandler wrapped;

    public YourExceptionHandler(ExceptionHandler wrapped) {
        this.wrapped = wrapped;
    }

    @Override
    public void handle() throws FacesException {
        FacesContext facesContext = FacesContext.getCurrentInstance();

        for (Iterator<ExceptionQueuedEvent> iter = getUnhandledExceptionQueuedEvents().iterator(); iter.hasNext();) {
            Throwable exception = iter.next().getContext().getException(); // There it is!

            // Now do your thing with it. This example implementation merely prints the stack trace.
            exception.printStackTrace();

            // You could redirect to an error page (bad practice).
            // Or you could render a full error page (as OmniFaces does).
            // Or you could show a FATAL faces message.
            // Or you could trigger an oncomplete script.
            // etc..
        }

        getWrapped().handle();
    }

    @Override
    public ExceptionHandler getWrapped() {
        return wrapped;
    }

}
需要在
faces config.xml
中注册,如下所示:

public class YourExceptionHandlerFactory extends ExceptionHandlerFactory {

    private ExceptionHandlerFactory parent;

    public YourExceptionHandlerFactory(ExceptionHandlerFactory parent) {
        this.parent = parent;
    }

    @Override
    public ExceptionHandler getExceptionHandler() {
        return new YourExceptionHandler(parent.getExceptionHandler());
    }

}
<factory>
    <exception-handler-factory>com.example.YourExceptionHandlerFactory</exception-handler-factory>
</factory>

com.example.YourExceptionHandlerFactory
或者,您可以继续使用OmniFaces。它将使用
web.xml
中的
配置,完全透明地确保异步请求期间的异常行为与同步请求期间的异常行为相同

另见:

是否要在异步请求期间在网页上显示完整的异常堆栈跟踪?否。我在网页上有一个标记,按下该标记(使用ajax处理)会导致异常。()但是Netbeans中的Glassfish输出没有显示堆栈跟踪。(). 另一方面,如果它是一个正常的http请求,则堆栈跟踪显示在HTML输出()中,而Netbeans中的Glassfish服务器输出显示堆栈跟踪()。继续…继续。。。我希望在ajax请求期间发生错误时,在Netbeans的Glassfish输出中显示堆栈跟踪(如下所示:)@微小的