Как программно зарегистрировать JSF ExceptionHandlerFactory в Spring Boot

Я использую Joinfaces для создания приложения JSF + Spring Boot, и Omnifaces упакован им.

Когда срок действия представления истекает и я перехожу, я получаю исключение ViewExpiredException. Когда я запускаю Ajax, страница ничего не делает, и ошибка отображается в консоли.

Можно ли программно зарегистрировать org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory с помощью Spring без необходимости добавлять .xml (web, faces-config) в мой проект?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
1
0
406
1

Ответы 1

Используйте следующее, чтобы настроить собственный обработчик исключений 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 (хотя я не тестировал это, чтобы увидеть, как он будет себя вести или будет ли работать хорошо)

Мой аннотированный класс '@SpringBootApplication' расширяет SpringBootServletInitializer, я '@Override' это метод onStartup и включаю 'FactoryFinder.setFactory', как упоминалось вами (я вызываю super () внутри него, чтобы убедиться, что Spring Boot может делать это самостоятельно), но это не работает. Есть идеи, почему?

BBacon 13.11.2018 18:54

Я попытался удалить SpringBootServletInitializer и просто расширить FacesInitializer, та же проблема, с вызовами Ajax ничего не происходит, и ошибка выводится на консоль.

BBacon 13.11.2018 19:51

Другие вопросы по теме