Я хочу «проверить нагрузку» на некоторые составные элементы управления (xhtml), когда запускается мой webapp. Но, когда я пытаюсь получить контекст приложения (getApplication()) Я сталкиваюсь с этим:Вызов context.getApplication() слишком рано?
IllegalStateException: Could not find backup for factory javax.faces.application.ApplicationFactory
Кстати, когда я удалить вызов getApplication(), веб-приложение работает отлично. Поэтому я не думаю, что другие потоки stackoverflow, связанные с наличием библиотек смешанных лиц, - моя проблема.
Вопрос/Помощь:
- Я думаю, что я звоню getApplication() слишком скоро?!?
- Когда я могу позвонить ему во время моей одноразовой инициализации?
Объяснение:
Я использую Eclipse (Mars)/Tomcat (8)/Mojarra (2.2.0). Мой код в настоящее время является простой страницей JSF с Java-компонентом, который в конечном итоге загружает кэшированную конфигурацию в статическом блоке инициализации. Поэтому, когда я начинаю отладку моей одной JSF-страницы в Eclipse, Tomcat запускается, мой статический инициализатор запускает и загружает всю мою «подключаемую» информацию. Когда он пытается вызвать «context.getApplication()», я получаю исключение «IllegalStateException Не удалось найти резервную копию для заводского javax.faces.application.ApplicationFactory».
В моем классе bean есть статический инициализатор, который ссылается на мои статические значения фабрики ENUM. Это мой ENUM завод значений (я использую некоторые приемы для статической инициализации в моем ENUM, но я думаю, что этот вопрос еще, что я звоню getApplication() в начале):
public enum CvcConfigEntities {
THING1(EntityType.TYPE1),
THING2(EntityType.TYPE2);
private static final class StaticBlock {
private static final String extPropertiesClassPathFmt = CvcConfig.EXT_PROPERTIES_CLASS_PATH_FMT.getValue();
private static final Logger logger = LoggerFactory.getLogger(CvcConfigEntities.class);
private static final Properties properties = CvcConfigReader.getProperties();
private static final Hashtable<EntityType, Hashtable<String, ExtensionDescriptor>> entityTypeExtensionDescriptorsByCode = new Hashtable<>();
private static final Hashtable<EntityType, List<ExtensionDescriptor>> entityTypeExtensionDescriptorsList = new Hashtable<>();
static {
readConfiguredDescriptors();
}
Это, наконец, воронки вниз это код, который пытается загрузить составной компонент:
public static UIComponent loadCompositeComponent(String taglibURI, String tagName, String id) {
FacesContext context = FacesContext.getCurrentInstance();
Application app = context.getApplication(); // <--- here
ViewHandler viewHandler = app.getViewHandler();
String rootViewId = context.getViewRoot().getViewId();
ViewDeclarationLanguage viewDeclarationLanguage = viewHandler.getViewDeclarationLanguage(context, rootViewId);
UIComponent composite = viewDeclarationLanguage.createComponent(context, taglibURI, tagName, null);
Bigger трассировки стека:
SEVERE: Critical error during deployment:
com.sun.faces.config.ConfigurationException: CONFIGURATION FAILED! java.util.concurrent.ExecutionException: java.lang.ExceptionInInitializerError
at com.sun.faces.config.ConfigManager.initialize(ConfigManager.java:449)
at com.sun.faces.config.ConfigureListener.contextInitialized(ConfigureListener.java:214)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4729)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5167)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: javax.faces.FacesException: java.util.concurrent.ExecutionException: java.lang.ExceptionInInitializerError
at com.sun.faces.config.ConfigManager.getAnnotatedClasses(ConfigManager.java:507)
at com.sun.faces.config.processor.AbstractConfigProcessor.processAnnotations(AbstractConfigProcessor.java:402)
[...]
Caused by: java.lang.IllegalStateException: Could not find backup for factory javax.faces.application.ApplicationFactory.
at javax.faces.FactoryFinder$FactoryManager.getFactory(FactoryFinder.java:1135)
at javax.faces.FactoryFinder.getFactory(FactoryFinder.java:379)
at com.sun.faces.config.InitFacesContext.getApplication(InitFacesContext.java:140)
at com.aadhoc.cvc.common.jsf.CompositeComponentLoader.loadCompositeComponent(CompositeComponentLoader.java:13)
at com.aadhoc.cvc.extensions.ExtensionLoader.loadCompositeComponent(ExtensionLoader.java:30)
at com.aadhoc.cvc.extensions.ExtensionLoader.checkExtensionDescriptor(ExtensionLoader.java:13)
at com.aadhoc.cvc.common.config.CvcConfigEntities.readDescriptor(CvcConfigEntities.java:135)
at com.aadhoc.cvc.common.config.CvcConfigEntities.readDescriptors(CvcConfigEntities.java:89)
at com.aadhoc.cvc.common.config.CvcConfigEntities.access$2(CvcConfigEntities.java:80)
at com.aadhoc.cvc.common.config.CvcConfigEntities$StaticBlock.readConfiguredDescriptors(CvcConfigEntities.java:40)