1

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

当视图过期并且我导航时,我得到了 ViewExpiredException。当我执行 Ajax 时,页面什么也不做,并且错误显示在控制台中。

是否可以org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory使用 Spring 以编程方式注册,而无需向我的项目添加 .xml(web、faces-config)?

4

1 回答 1

1

使用以下内容设置自定义异常处理程序 sans web.xml:

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

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

好消息是我实际上在 Mojarra 代码库中找不到默认设置异常处理程序工厂的任何地方,因此您可能可以在@PostConstructor任何@ApplicationScopedbean 的构造函数(而不是 )中执行它。您也可以在 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(尽管我尚未对此进行测试以查看它的行为方式或性能是否良好)

于 2018-11-10T22:00:59.593 回答