如何在Spring Boot中以编程方式注册JSF ExceptionHandlerFactory

时间:2018-11-09 13:56:46

标签: spring-boot jsf exceptionhandler joinfaces

我正在使用Joinfaces来构建JSF + Spring Boot应用程序,并且Omnifaces包含了它。

当View过期并导航时,出现ViewExpiredException。当我执行Ajax时,页面不执行任何操作,并且该错误在控制台中显示。

是否可以在Spring中以编程方式注册org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory,而不必向我的项目中添加.xml(Web,faces-config)?

1 个答案:

答案 0 :(得分:0)

使用以下内容在没有web.xml的情况下设置自定义异常处理程序:

FactoryFinder.setFactory(FactoryFinder.EXCEPTION_HANDLER_FACTORY,"org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory");

这里的技巧是确保在启动时尽早执行此行;一旦FactoryFinder.getFactory()被JSF运行时调用,现在更改已配置的处理程序为时已晚。

好处是,我实际上在Mojarra代码库中找不到默认设置了异常处理程序工厂的任何地方,因此您可能可以在以下代码的构造函数(而非@PostConstructor)中执行此操作任何@ApplicationScoped bean。您也可以在ame bean的静态初始化程序中完成该操作。

此外,您可以在FacesInitializer中进行操作。因此,假设您正在运行Mojarra,则需要在Servlet上下文的启动过程中尽早设置处理程序

public class YourWebAppInitializer extends FacesInitializer implements WebApplicationInitializer {

    public void onStartup(ServletContext ctxt) throws ServletException {

        AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext();
        root.register(YourSpringConfigClass.class);
        ctxt.addListener(new ContextLoaderListener(root));
        FactoryFinder.setFactory(FactoryFinder.EXCEPTION_HANDLER_FACTORY,"org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory");
    }
}

WebApplicationInitializer是Spring支持的用于引导Web应用程序的标准接口,我假设您已经有了该接口,因为您没有web.xml-随时替换其中的内容onStartup方法以及实际实现中的所有方法。这里的关键是确保您在此处设置工厂,这是在应用程序启动的早期。

还要注意,您可以在ExceptionHandler的任何给定实例上手动设置实际的FacesContext(尽管我还没有测试它的运行方式或性能是否良好)