Как программно зарегистрировать JSF ExceptionHandlerFactory в Spring Boot - PullRequest
0 голосов
/ 09 ноября 2018

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

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

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

1 Ответ

0 голосов
/ 11 ноября 2018

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

...