Eclipse 调用context.getApplication()太早?
我想在webapp启动时“测试加载”一些复合控件(xhtml)。 但是,当我尝试获取应用程序上下文(getApplication())时,我遇到了以下问题:Eclipse 调用context.getApplication()太早?,eclipse,jsf,tomcat,mojarra,Eclipse,Jsf,Tomcat,Mojarra,我想在webapp启动时“测试加载”一些复合控件(xhtml)。 但是,当我尝试获取应用程序上下文(getApplication())时,我遇到了以下问题: IllegalStateException: Could not find backup for factory javax.faces.application.ApplicationFactory 顺便说一句,当我删除对getApplication()的调用时,webapp工作正常。所以我不认为其他与混合面库相关的stackoverfl
IllegalStateException: Could not find backup for factory javax.faces.application.ApplicationFactory
顺便说一句,当我删除对getApplication()的调用时,webapp工作正常。所以我不认为其他与混合面库相关的stackoverflow线程是我的问题
问题/帮助:
- 我想我调用getApplication()太快了强>
- 在我的一次性初始化过程中,什么时候可以调用它?
我重构并修复了这个问题 似乎在应用程序生命周期的早期调用了带有静态初始值设定项的工厂 我将代码重构为一个
@ApplicationScoped
bean,并使用@PostConstruct
进行初始化,现在排序工作正常。当应用程序启动并且Tomcat准备就绪时,它将执行我的初始化。我还允许自己在基于控制台的应用程序可以调用的类上使用load()
方法,这样它就不必依赖JSF@PostConstruct
@ManagedBean(name="extensionsBean")
@ApplicationScoped
public class ExtensionsBean {
private final ExtensionsConfig extensionsConfig = new ExtensionsConfig();
@PostConstruct
private void init() {
extensionsConfig.load(new ExtensionJsfValidator());
}
显然,我更多地考虑的是“应用程序初始化”,而不是一个具有自己初始值设定项的应用程序范围bean
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);
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)
@ManagedBean(name="extensionsBean")
@ApplicationScoped
public class ExtensionsBean {
private final ExtensionsConfig extensionsConfig = new ExtensionsConfig();
@PostConstruct
private void init() {
extensionsConfig.load(new ExtensionJsfValidator());
}