Используйте следующее, чтобы настроить собственный обработчик исключений без web.xml:
FactoryFinder.setFactory(FactoryFinder.EXCEPTION_HANDLER_FACTORY,"org.omnifaces.exceptionhandler.FullAjaxExceptionHandlerFactory");
Хитрость заключается в том, чтобы убедиться, что эта строка выполняется как можно раньше при запуске; как только среда выполнения JSF вызывает FactoryFinder.getFactory()
, уже слишком поздно менять настроенный обработчик.
Хорошо то, что я на самом деле не могу найти нигде в кодовой базе Mojarra, где фабрика обработчиков исключений устанавливается по умолчанию, поэтому вы, вероятно, могли бы выполнить это, возможно, в конструкторе (не @PostConstructor
) любого @ApplicationScoped
bean. Вы также можете сделать это в статическом инициализаторе 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
(хотя я не проверял это, чтобы увидеть, как он будет себя вести или будет ли он работать хорошо)
person
kolossus
schedule
10.11.2018