Я использую контейнер 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;
}
}
Пожалуйста, любые идеи, чтобы обойти эту проблему