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