Как программно зарегистрировать JSF ExceptionHandlerFactory в Spring Boot
Я использую Joinfaces для создания приложения JSF + Spring Boot, и Omnifaces упакован с ним.
Когда срок действия представления истекает, и я перемещаюсь, я получаю исключение ViewExpiredException. Когда я выполняю Ajax, страница ничего не делает, и в консоли отображается ошибка.
Можно ли зарегистрировать org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory
программно с Spring, без необходимости добавлять.xml (web, face-config) в мой проект?
1 ответ
Используйте следующую команду для настройки пользовательского обработчика исключений без web.xml:
FactoryFinder.setFactory(FactoryFinder.EXCEPTION_HANDLER_FACTORY,"org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory");
Хитрость заключается в том, чтобы эта строка выполнялась как можно раньше при запуске; один раз FactoryFinder.getFactory()
был вызван средой выполнения JSF, слишком поздно менять настроенный обработчик.
Хорошо, что на самом деле я не могу найти нигде в кодовой базе Mojarra, где фабрика обработчиков исключений устанавливается по умолчанию, так что вы, вероятно, можете выполнить это, возможно, в конструкторе (не @PostConstructor
) любой @ApplicationScoped
боб. Вы также можете сделать это в статическом инициализаторе ame bean.
Кроме того, вы можете сделать это в FacesInitializer
, Таким образом, предполагая, что вы используете Mojarra, вам нужно будет установить обработчик очень рано в процессе запуска контекста сервлета
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.xml - смело заменяйте содержимое onStartup
метод с тем, что у вас есть в вашей реальной реализации. Ключевым моментом здесь является то, чтобы убедиться, что вы установили фабрику там, что довольно рано при запуске приложения.
Также обратите внимание, что вы можете вручную установить фактическую ExceptionHandler
на любой данный случай FacesContext
(хотя я не проверял это, чтобы увидеть, как он будет себя вести или будет ли он работать хорошо)