2015-09-08 3 views
0

Я хочу «проверить нагрузку» на некоторые составные элементы управления (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) 

ответ

0

Я переработан и исправили проблему.

Похоже, что мой завод со статическим инициализатором был вызван слишком рано в жизненном цикле приложения.

Я отредактировал код в bean-компоненте @ApplicationScoped с инициализацией @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()); 
    } 

я явно больше думать о «инициализации приложения», а не приложении, область действия боба со своим собственным инициализатором.

Смежные вопросы