2015-05-23 4 views
4

Я использую контейнер CDI Weld с потоком JSF 2.2.Сварщик больше не регистрирует @ViewScoped beans после добавления Hibernate и Jandex

<dependency> 
     <groupId>org.jboss.weld.servlet</groupId> 
     <artifactId>weld-servlet-core</artifactId> 
     <version>2.2.11.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>org.jboss.weld</groupId> 
     <artifactId>weld-core-jsf</artifactId> 
     <version>2.2.11.Final</version> 
    </dependency> 

Я использую аннотированный режим обнаружения

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns = "http://xmlns.jcp.org/xml/ns/javaee" bean-discovery-mode = "annotated"/> 

Я также пытаюсь использовать спящий режим в приложении последней стабильной версии

 <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
      <version>4.3.10.Final</version> 
     </dependency> 

Эта версия имеет переходную зависимость org.jboss: Jandex : 1.1.0. Финал, который делает исключение Weld исключением

Caused by: java.lang.NoSuchMethodError: org.jboss.jandex.ClassInfo.hasNoArgsConstructor()Z 
at org.jboss.weld.environment.deployment.discovery.jandex.JandexClassFileInfo.<init>(JandexClassFileInfo.java:65) 
at org.jboss.weld.environment.deployment.discovery.jandex.JandexClassFileServices.getClassFileInfo(JandexClassFileServices.java:82) 
at org.jboss.weld.bootstrap.FastAnnotatedTypeLoader.loadAnnotatedType(FastAnnotatedTypeLoader.java:64) 
at org.jboss.weld.bootstrap.BeanDeployer.addClass(BeanDeployer.java:97) 
at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$1.doWork(ConcurrentBeanDeployer.java:65) 
at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$1.doWork(ConcurrentBeanDeployer.java:62) 
at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:60) 
at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:53) 
at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
... 3 more 

Чтобы обойти исключение, я добавил на пути к классам последней версии Jandex зависимости

<dependency> 
     <groupId>org.jboss</groupId> 
     <artifactId>jandex</artifactId> 
     <version>1.2.4.Final</version> 
    </dependency> 

В присутствии Jandex в Weld не классы зарегистрировать @ javax.faces.view.ViewScoped и @ javax.faces.flow .FlowScoped beans. Проблема в том, что наличие org.jboss.jandex.Index в пути к классам применяет стратегию org.jboss.weld.environment.deployment.discovery.jandex.JandexDiscoveryStrategy для регистровых компонентов.

org.jboss.weld.environment.deployment.discovery.DiscoveryStrategyFactory#create 

    if (Reflections.isClassLoadable(resourceLoader, JANDEX_INDEX_CLASS_NAME)) { 
     CommonLogger.LOG.usingJandex(); 
     try { 
      return cast(classForName(resourceLoader, JANDEX_DISCOVERY_STRATEGY_CLASS_NAME).getConstructor(ResourceLoader.class, Bootstrap.class, Set.class) 
        .newInstance(resourceLoader, bootstrap, initialBeanDefiningAnnotations)); 
     } catch (Exception e) { 
      throw CommonLogger.LOG.unableToInstantiate(JANDEX_DISCOVERY_STRATEGY_CLASS_NAME, 
        Arrays.toString(new Object[] { resourceLoader, bootstrap, initialBeanDefiningAnnotations }), e); 
     } 
    } 
    return new ReflectionDiscoveryStrategy(resourceLoader, bootstrap, initialBeanDefiningAnnotations); 

Эта стратегия не анализирует аннотации @ViewScoped и @FlowScoped bean. Первоначально используется org.jboss.weld.environment.deployment.discovery.ReflectionDiscoveryStrategy, в котором анализируется метаинформация bean annotation. В частности проверяет @ javax.enterprise.context.NormalScope

@NormalScope 
@Inherited 
@Documented 
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD}) 
@Retention(value = RetentionPolicy.RUNTIME) 
public @interface ViewScoped { 
} 

org.jboss.weld.environment.deployment.discovery.ReflectionDiscoveryStrategy # hasBeanDefiningAnnotation

for (Class<? extends Annotation> metaAnnotation : metaAnnotations) { 
     // The check is not perfomed recursively as bean defining annotations must be declared directly on a bean class 
     // Also we don't cache the results and rely completely on the reflection optimizations 
     if (hasBeanDefiningMetaAnnotationSpecified(clazz.getAnnotations(), metaAnnotation)) { 
      return true; 
     } 
    } 

Пожалуйста, любые идеи, чтобы обойти эту проблему

ответ

1

Это будет исправлено в Weld 2.3.5.Final. См. Также WELD-2160.

Из выпуска комментариев:

Ну, проблема javax.faces-2.2.12.jar не архив боба - это не содержит beans.xml, но содержит портативное расширение - см тоже http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#bean_archive. И поэтому содержимое javax.faces-2.2.12.jar игнорируется и javax.faces.view.ViewScoped не добавляется в набор компонентов, определяющих аннотации . Это верно, com.sun.faces.application.view.ViewScopeExtension использует BeforeBeanDiscovery.addScope() для регистрации ViewScoped в виде аннотации . Однако это в настоящее время не поддерживается Weld - см. также WELD-1624 (из-за проблемы с куриным яйцом). Мы должны улучшить способ, которым JandexDiscoveryStrategy идентифицирует аннотацию аннотации с помощью @NormalScope.