首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Weld在添加Hibernate和Jandex之后不再注册@ViewScoped bean

Weld在添加Hibernate和Jandex之后不再注册@ViewScoped bean
EN

Stack Overflow用户
提问于 2015-05-23 12:21:45
回答 1查看 1.1K关注 0票数 4

我使用带有JSF2.2流的CDI焊接容器。

代码语言:javascript
复制
    <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>

我使用带注释的发现模式。

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns = "http://xmlns.jcp.org/xml/ns/javaee" bean-discovery-mode = "annotated"/>

我还尝试在应用程序中使用hibernate,这是最新的稳定版本。

代码语言:javascript
复制
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.10.Final</version>
        </dependency>

此版本有一个传递依赖项org.joss:jandex:1.1.0.Final,它呈现Weld抛出的异常。

代码语言:javascript
复制
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

为了避免异常,我在classpath上添加了最新版本的jandex依赖项。

代码语言:javascript
复制
    <dependency>
        <groupId>org.jboss</groupId>
        <artifactId>jandex</artifactId>
        <version>1.2.4.Final</version>
    </dependency>

在类路径中有jandex存在的情况下,不要注册@javax.faces.view.ViewScoped和@javax.faces.flow.FlowScoped bean。问题是类路径中存在的org.jboss.weld.environment.deployment.discovery.jandex.JandexDiscoveryStrategy适用于寄存器bean的org.jboss.jandex.Index策略。

代码语言:javascript
复制
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注释。最初使用org.jboss.weld.environment.deployment.discovery.ReflectionDiscoveryStrategy,来分析bean注释、元信息。专门检查@javax.enterprise.context.NormalScope

代码语言:javascript
复制
@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

代码语言:javascript
复制
    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;
        }
    }

请你想办法解决这个问题。

EN

回答 1

Stack Overflow用户

发布于 2016-05-31 12:06:50

这将在焊接2.3.5终中修复。另见焊接-2160

从问题评论:

问题是javax.Faces--2.2.12.jar不是bean存档--它不包含beans.xml,但包含可移植的扩展--参见归档。因此,javax.faces-2.2.12.jar的内容被忽略了,javax.faces.view.ViewScoped也没有添加到bean定义注释的集合中。的确,com.sun.faces.application.view.ViewScopeExtension使用BeforeBeanDiscovery.addScope()将ViewScoped注册为范围注释。然而,这是目前不支持焊接-也见焊接-1624(由于鸡蛋类问题)。我们应该改进JandexDiscoveryStrategy识别带有@NormalScope注释的注释的方式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30412613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档