Eclipse 调用context.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

我想在webapp启动时“测试加载”一些复合控件(xhtml)。 但是,当我尝试获取应用程序上下文(getApplication())时,我遇到了以下问题:

IllegalStateException: Could not find backup for factory javax.faces.application.ApplicationFactory
顺便说一句,当我删除对getApplication()的调用时,webapp工作正常。所以我不认为其他与混合面库相关的stackoverflow线程是我的问题

问题/帮助:

  • 我想我调用getApplication()太快了
  • 在我的一次性初始化过程中,什么时候可以调用它?
说明:

我正在使用Eclipse(火星)/Tomcat(8)/Mojarra(2.2.0)。 我的代码目前是一个简单的JSF页面,带有一个JavaBean,它最终在一个静态初始化块中加载一个缓存配置。因此,当我开始在Eclipse中调试我的一个JSF页面时,Tomcat启动,我的静态初始值设定项启动并加载我的所有“插件”信息。当它尝试调用“context.getApplication()”时,我得到了“IllegalStateException找不到工厂javax.faces.application.ApplicationFactory的备份”异常

我的bean类有一个静态初始值设定项,它引用我的枚举工厂静态值。这是我的值枚举工厂(我在枚举中对静态init使用了一些技巧,但我认为问题仍然是我正在调用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());
    }