2016-03-22 5 views
2

Я использую Tomcat 8 (8.0.30), OpenWebBeans 1.6.2, JSF Mojarra 2.2.12 и OmniFaces 1.8. Я решил, что хочу обновить OmniFaces до более поздней версии. После 2.0, похоже, требуется CDI, но при запуске Tomcat (с OmniFaces 2.2) я получаю ошибку ниже. Согласно Matrix совместимости OmniFaces, Tomcat + Mojarra + OWB должен работать с 8.0.30 + 2.2.12 + 1.6.2.OmniFaces не распознает OpenWebBean как CDI после 2.0

Я тоже пробовал с 2.0, с той же ошибкой. В версии 2.1 у меня есть еще одна проблема, но я просто предположил, что это было исправлено для 2.2, поскольку поведение там такое же, как в 2.0. Я также получаю ту же проблему с 2.3-RC1.

Есть ли что-то конкретное, что нужно сделать, чтобы заставить OmniFaces распознать, что я запускаю CDI? Возможно, это ошибка в OmniFaces?

Я создал очень маленькое примерное приложение, чтобы воспроизвести эту проблему, поэтому я уверен, что в нашем основном приложении нет ничего другого.

mar 22, 2016 10:57:46 FM org.apache.webbeans.lifecycle.AbstractLifeCycle bootstrapApplication 
INFO: OpenWebBeans Container has started, it took [447] ms. 
mar 22, 2016 10:57:46 FM org.omnifaces.ApplicationListener checkCDIAvailable 
SEVERE: 
???????????????????????????????????????????????????????????????????????????????? 
?       ??  ?            ? 
? ?     ????? ? OmniFaces failed to initialize!    ? 
? ????    ?????? ?            ? 
? ??????   ??????? ? This OmniFaces version requires CDI, but ? 
? ???????   ???????  ? none was found on this environment.   ? 
? ???????????????????????  ?            ? 
? ???????????????????????  ? OmniFaces 2.x requires a minimum of JSF 2.2.? 
?  ?????????????????????  ? Since this JSF version, the JSF managed bean? 
?  ?????????????????????  ? facility @ManagedBean is semi-official  ? 
?  ??????????????????????  ? deprecated in favour of CDI. JSF 2.2 users ? 
?  ??????????????????????  ? are strongly encouraged to move to CDI.  ? 
?  ??????????????????????  ?            ? 
? ???????????????????????  ? OmniFaces goes a step further by making CDI ? 
? ???????????????????????? ? a REQUIRED dependency next to JSF 2.2. This ? 
? ???????????????????????? ? not only ensures that your web application ? 
? ???????????????? ???????? ? represents the state of art, but this also ? 
? ????????????????????????? ? makes for us easier to develop OmniFaces, ? 
? ?????????????????????????? ? without the need for all sorts of hacks in ? 
? ?????????????????????????? ? in order to get OmniFaces to deploy on  ? 
? ???????????????????????????? ? environments without CDI.     ? 
? ???????????????????????????? ?            ? 
? ???????????????????????????? ? You have 3 options:       ? 
?????????????????????????????????? 1. Downgrade to OmniFaces 1.x.    ? 
?????????????????????????????????? 2. Install CDI in this environment.   ? 
?????????????????????????????????? 3. Switch to a CDI capable environment.  ? 
??????????????????????????????????            ? 
?????????????????????????????????? For additional instructions, check   ? 
?????????????????????????????????? http://omnifaces.org/cdi     ? 
??????????????????????????????????            ? 
???????????????????????????????????????????????????????????????????????????????? 
mar 22, 2016 10:57:46 FM org.apache.catalina.core.StandardContext listenerStart 
SEVERE: Exception sending context initialized event to listener instance of class org.omnifaces.ApplicationListener 
java.lang.ExceptionInInitializerError 
    at org.omnifaces.ApplicationListener.checkCDIAvailable(ApplicationListener.java:74) 
    at org.omnifaces.ApplicationListener.contextInitialized(ApplicationListener.java:58) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4791) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5285) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549) 
    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: java.lang.IllegalStateException: CDI BeanManager instance is not available in JNDI. 
    at org.omnifaces.config.BeanManager.<init>(BeanManager.java:99) 
    at org.omnifaces.config.BeanManager.<clinit>(BeanManager.java:49) 
    ... 11 more 
Caused by: java.lang.IllegalStateException: javax.naming.NamingException: Cannot create resource instance 
    at org.omnifaces.util.JNDI.lookup(JNDI.java:95) 
    at org.omnifaces.config.BeanManager.<init>(BeanManager.java:95) 
    ... 12 more 
Caused by: javax.naming.NamingException: Cannot create resource instance 
    at org.apache.naming.factory.ResourceEnvFactory.getObjectInstance(ResourceEnvFactory.java:117) 
    at javax.naming.spi.NamingManager.getObjectInstance(Unknown Source) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:843) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:154) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:831) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:154) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:831) 
    at org.apache.naming.NamingContext.lookup(NamingContext.java:168) 
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:158) 
    at javax.naming.InitialContext.lookup(Unknown Source) 
    at org.omnifaces.util.JNDI.lookup(JNDI.java:90) 
    ... 13 more 

Вот pom.xml я использую:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 
    <groupId>se.app.testapp</groupId> 
    <artifactId>sampleapp</artifactId> 
    <packaging>war</packaging> 
    <version>1.0-SNAPSHOT</version> 

    <dependencies> 
     <dependency> 
      <groupId>javax.enterprise</groupId> 
      <artifactId>cdi-api</artifactId> 
      <version>1.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.openwebbeans</groupId> 
      <artifactId>openwebbeans-impl</artifactId> 
      <version>1.6.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.openwebbeans</groupId> 
      <artifactId>openwebbeans-jsf</artifactId> 
      <version>1.6.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.openwebbeans</groupId> 
      <artifactId>openwebbeans-el22</artifactId> 
      <version>1.6.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.openwebbeans</groupId> 
      <artifactId>openwebbeans-web</artifactId> 
      <version>1.6.2</version> 
     </dependency> 
     <dependency> 
      <groupId>org.glassfish</groupId> 
      <artifactId>javax.faces</artifactId> 
      <version>2.2.12</version> 
     </dependency> 
     <dependency> 
      <groupId>org.omnifaces</groupId> 
      <artifactId>omnifaces</artifactId> 
      <version>2.2</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>1.0.0.GA</version> 
      <type>jar</type> 
      <classifier>sources</classifier> 
     </dependency> 
     <dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>1.0.0.GA</version> 
      <type>jar</type> 
     </dependency> 

    </dependencies> 
</project> 
+0

Работает ли OWB без OmniFaces? Корневая причина говорит, что CDI BeanManager не может быть найден в JNDI, что произойдет, если вы не зарегистрировали его в контексте.xml для Tomcat, но тогда вы уже не сможете использовать CDI полностью, даже без OmniFaces. Если у вас есть свобода выбора CDI impl, для Weld вы можете найти полные инструкции в ссылке в сообщении об ошибке. – BalusC

+0

Да, OWB отлично работает в противном случае, запускал его в течение некоторого времени с тех пор, как мы изменились с Weld. Без вопросов. У меня нет BeanManager, зарегистрированного в context.xml. Это должно быть необходимо? Я все еще могу запускать как свое примерное приложение, так и наше полное приложение с OWB без проблем. – Robin

+0

FYI: Я только что сделал успешный пробный пропуск для OmniFaces 2.3 на Tomcat 8.0.32 + OWB 1.6.2, я заметил, что забыл о них в [матрице совместимости] (https://github.com/omnifaces/omnifaces/wiki/Compatibility -Матрица). Спасибо за головы! – BalusC

ответ

0

Причина Вашего исключения есть:

java.lang.IllegalStateException: экземпляр CDI BeanManager не доступен в JNDI.

Другими словами, CDI BeanManager не зарегистрирован в JNDI при инициализации контекста OmniFaces. Обычно Tomcat имеет JNDI только для чтения, и любые новые ресурсы JNDI должны быть предоставлены через webapp /META-INF/context.xml. Для Weld, это подробный How to install CDI in Tomcat? и OpenWebBeans вам нужно ниже одного:

<Context> 
    <Resource name="BeanManager" 
     auth="Container" 
     type="javax.enterprise.inject.spi.BeanManager" 
     factory="org.apache.webbeans.container.ManagerObjectFactory" /> 
</Context> 

Кроме того, для OWB также необходимо явным образом зарегистрировать свой контекст слушателя в WebApp-х /WEB-INF/web.xml для того, чтобы гарантировать, что она инициализируется перед OmniFaces.

<listener> 
    <listener-class>org.apache.webbeans.servlet.WebBeansConfigurationListener</listener-class> 
</listener> 

В противном случае вы можете получить исключение, которое выглядит, как показано ниже, когда OmniFaces @Eager начинает инициализировать приложение областью действия фасоли:

java.lang.IllegalStateException: Это не позволило назвать getBeans (Тип, аннотаций ...) перед AfterBeanDiscovery

несмотря на то, что вы уже указали OmniFaces 2,2, я хотел бы добавить заметку для будущих читателей, что minimum из OmniFaces 2,1 требуется Орды чтобы мирно работать вместе с OWB вручную, установленным на Tomcat (OmniFaces 2.0 отлично работает на TomEE), см. также issue 133, в котором исправлено 2 основных вопроса по порядку инициализации и @Inject, которые недоступны в @WebListener.


Update: статья "How to install CDI in Tomcat?" только что был обновлен с инструкциями для OpenWebBeans.

+0

Жаль, что я немного опоздал, но просто хотел сказать, что это исправило проблему и отметило ее как разрешенную! – Robin

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

  • Нет связанных вопросов^_^