Я использую Joinfaces для создания приложения JSF + Spring Boot, и Omnifaces упакован им.
Когда срок действия представления истекает и я перехожу, я получаю исключение ViewExpiredException. Когда я запускаю Ajax, страница ничего не делает, и ошибка отображается в консоли.
Можно ли программно зарегистрировать org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory с помощью Spring без необходимости добавлять .xml (web, faces-config) в мой проект?




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