我正在使用Joinfaces来构建JSF + Spring Boot应用程序,并且Omnifaces包含了它。
当View过期并导航时,出现ViewExpiredException。当我执行Ajax时,页面不执行任何操作,并且该错误在控制台中显示。
是否可以在Spring中以编程方式注册org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory
,而不必向我的项目中添加.xml(Web,faces-config)?
答案 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
(尽管我还没有测试它的运行方式或性能是否良好)