gpt4 book ai didi

eclipse - 过早调用 context.getApplication()?

转载 作者:行者123 更新时间:2023-11-28 23:29:28 24 4
gpt4 key购买 nike

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

IllegalStateException: Could not find backup for factory javax.faces.application.ApplicationFactory

顺便说一句,当我删除对 getApplication() 的调用时,webapp 工作正常。所以我不认为与混合面孔库相关的其他 stackoverflow 线程是我的问题。

问题/帮助:

  • 我觉得我调用 getApplication() 太早了?!?
  • 我什么时候可以在一次性初始化期间调用它?

解释:

我正在使用 Eclipse(Mars)/Tomcat(8)/Mojarra(2.2.0)。我的代码目前是一个带有 Java bean 的简单 JSF 页面,它最终在静态初始化 block 中加载缓存配置。因此,当我开始在 Eclipse 中调试我的一个 JSF 页面时,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);

更大的堆栈跟踪:

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)

最佳答案

我重构并修复了问题。

看来我的带有静态初始化程序的工厂在应用程序生命周期中被调用得太早了。

我将代码重构为一个 @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。

关于eclipse - 过早调用 context.getApplication()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32467076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com