- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在我的网络应用程序启动时“测试加载”一些复合控件 (xhtml)。但是,当我尝试获取应用程序上下文 (getApplication()) 时,我遇到了这个问题:
IllegalStateException: Could not find backup for factory javax.faces.application.ApplicationFactory
顺便说一句,当我删除对 getApplication() 的调用时,webapp 工作正常。所以我不认为与混合面孔库相关的其他 stackoverflow 线程是我的问题。
问题/帮助:
解释:
我正在使用 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/
我有一个关于 wicket getApplication 的问题。 getApplication() 和 getSession().getApplication 有什么区别? 部署 wicket 应用
我在我的应用程序中创建了一个 Android 全局变量,当我尝试在我的 Activity 中使用 getApplication 访问它时,我收到错误: Cannot resolve method ge
我正在使用 getHotelName() 和 setHotelName() 在应用程序中存储数据,然后访问它。在我分类为 Launcher 的主要 Activity 中,方法和 getApplicat
我花了一段时间阅读这篇文章,但还没有找到答案。 我在一个应用程序中进行了一些 Activity 。我想在它们之间共享一些不适合 Intent 或序列化数据文件的数据。我知道我可以为此目的使用整个应用程
我想在我的网络应用程序启动时“测试加载”一些复合控件 (xhtml)。但是,当我尝试获取应用程序上下文 (getApplication()) 时,我遇到了这个问题: IllegalStateExcep
我正在尝试按照 Java 中的示例进行操作,但遇到了一些问题。 我已经创建了我自己的应用程序子类,我现在正试图在我的 baseactivity 中获取对所有其他事件将从其继承的引用。 要在 java
我正在尝试限制一系列应用程序,使用相同的 Activity (在所有人共享的图书馆项目中),以便一次只有一个这样的应用程序可以运行。 在我尝试学习如何去做的第一轮尝试中,我了解到: android:l
我找不到令人满意的答案,所以我们开始吧:Activity/Service.getApplication() 和 Context.getApplicationContext() 是怎么回事? 在我们的应
我想在 Recyclerview 的 onClickListener 方法中膨胀 Recyclerview。 为此,我知道我必须从相应的 Activity 中获取上下文才能设置 LinearLayou
我确定我昨晚没有做任何奇怪或错误的事情。昨晚,我仍然能够 Toast.makeText(getApplicationContext(), "Some String", Toast.LENGTH_SHO
大家下午好!我正在 Android Studio 中开发一个搜索系统,但我是 Java 语言的初学者,我的错误可能很愚蠢。我想帮助理解两件事。第一:为什么我不能访问 this.getApplicati
我有类 App,其中包含我的 Application 的上下文。但是当我编译时,我在这一行的其他类中得到了一个错误: App app = (App) getApplication(); 类应用: i
我使用应用程序访问我的数据。当按钮被点击时,我想使用应用程序中的数据。我使用以下代码: b.setOnClickListener(new OnClickListener() { @Override p
我试图让 Dagger 简单示例在 IntelliJ 中运行,但它在 DemoBaseActivity 类中的 getApplication 调用失败: public abstract class D
我在一个 Activity 中运行以下行,它在同一个应用程序中,但在不同的包中: AppObject appObj = (AppObject)this.getApplication(); // FYI
(这里已经很晚了,所以可以监督一些非常简单的事情..) 我有以下类(class): public class GlobalState extends Application { private
有什么区别: getApplicationContext() getBasecontext() getApplication() getParent() 你能用一个简单的例子详细说明吗? 最佳答案 g
本文整理了Java中com.zsmartsystems.zigbee.ZigBeeEndpoint.getApplication()方法的一些代码示例,展示了ZigBeeEndpoint.getApp
我有一个带有自定义应用程序类的 Android 应用程序: 一般工作。在主要 Activity 的onCreate ,我检索应用程序对象: public App App() { return
一切正常,直到两天前我收到此错误: > Task :app:compileDebugJavaWithJavac FAILED Deprecated Gradle features were used
我是一名优秀的程序员,十分优秀!