当前位置: 首页 > 面试题库 >

JSF Ajax请求中的异常处理

颛孙飞
2023-03-14
问题内容

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

如果相关,那么我在Netbeans中使用GlassFish。


问题答案:

OmniFaces
FullAjaxExceptionHandler展示柜中
充实了这个问题。

缺省情况下,如果在JSF
ajax请求期间发生异常,则无论操作是否成功执行,最终用户都不会获得任何形式的反馈。在Mojarra中,仅当项目阶段设置为“开发”时,最终用户才会看到仅包含异常类型和消息的裸JavaScript警报。

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

为了捕获和记录异常并有选择地更改整个响应,您基本上需要创建一个custom
ExceptionHandler。不幸的是,标准JSF没有提供默认的默认值(至少不是明智的选择)。在您的自定义异常处理程序中,您将可以使用Exception引起所有麻烦的实例。

这是一个启动示例:

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;
    }

}

为了使其运行,请ExceptionHandlerFactory如下创建一个自定义:

public class YourExceptionHandlerFactory extends ExceptionHandlerFactory {

    private ExceptionHandlerFactory parent;

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

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

}

其中需要注册faces-config.xml如下:

<factory>
    <exception-handler-factory>com.example.YourExceptionHandlerFactory</exception-html" target="_blank">handler-factory>
</factory>

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



 类似资料:
  • Spring MVC 3.2开始引入了基于Servlet 3的异步请求处理。相比以前,控制器方法已经不一定需要返回一个值,而是可以返回一个java.util.concurrent.Callable的对象,并通过Spring MVC所管理的线程来产生返回值。与此同时,Servlet容器的主线程则可以退出并释放其资源了,同时也允许容器去处理其他的请求。通过一个TaskExecutor,Spring M

  • 在我的代码中,所有请求都有一个超时期。对于每个请求,我都必须处理超时异常。有没有办法在请求中附加全局超时异常处理程序? 和上面一样,我每次都要处理超时和引发服务不可用。我想要一些通用的东西,每当超时发生,它将引起服务不可用。

  • 异常严重:Servlet。路径为[z2]的上下文中servlet[dispatcher]的service()引发异常[请求处理失败;嵌套异常为org.springframework.dao.DataIntegrityViolationException:not null属性引用null或瞬时值:com.spring.entity.Product.cd;嵌套异常为org.hibernate.Prop

  • 当我尝试连接到Oracle数据库时,出现了以下问题。 有例外 此reportMapper.xml

  • 我得到的。 这是我的密码: 我得到错误作为 2014年10月16日下午4:31:47 严重:Servlet。路径为[/CustomerPortal]的上下文中servlet[dispatcherServlet]的服务()引发了异常[Request processing failed;嵌套异常为java.lang.NumberFormatException:null],其根本原因为 当我运行这个项目

  • 从数据库中检索数据时出现通信问题 合同数据服务 DataDbContext IContractDataService DataApicController Program.cs 错误 处理请求时发生未经处理的异常。InvalidOperationException:无法解析ContractShorting类型的服务。果心接口。IContractDataService“试图激活ContractSho