1

我的问题 - 有人知道如何在Weld中获取Deployment接口的实例吗?理想情况下在beforeBeanDiscovery事件中?

我正在尝试在我的应用程序中实现一个插件系统,其中 jar 由我的战争应用程序加载。我为此使用JBoss AS 7.1

我试图在部署过程中包含 JAR,但除非 jar 位于 WEB-INF/lib 文件夹中,否则这似乎是不可能的。

所以我的下一步是尝试让 CDI (Weld) 来发现外部 JAR 中的 bean。

似乎 CDI 没有直接支持包含要发现的新 jar,但 Weld 有一个部署接口和一个名为 loadDeploymentArchive 的方法(http://docs.jboss.org/weld/javadoc/2.0/weld-spi/org/jboss /weld/bootstrap/spi/Deployment.html#loadBeanDeploymentArchive(java.lang.Class) )

4

2 回答 2

0

实际上,我在http://relation.to/12981.lace的 Gavin King 的这篇文章中找到了答案

基本上我必须像这样创建一个扩展并映射 afterBeanDiscovery 事件:

public void afterBeanDiscovery(@Observes AfterBeanDiscovery abd, BeanManager bm) {
    for ( final Class c: getBeanClasses() ) {

        //use this to read annotations of the class
        AnnotatedType at = bm.createAnnotatedType(c);

        //use this to create the class and inject dependencies
        final InjectionTarget it = bm.createInjectionTarget(at);

        abd.addBean( new Bean() {
            @Override
            public Class<?> getBeanClass() {
                return c;
            }

            @Override
            public Set<InjectionPoint> getInjectionPoints() {
                return it.getInjectionPoints();
            }

            @Override
            public String getName() {
                String s = c.getSimpleName();
                s = Character.toLowerCase( s.charAt(0) ) + s.substring(1);
                return s;
            }

            @Override
            public Set<Annotation> getQualifiers() {
                Set<Annotation> qualifiers = new HashSet<Annotation>();
                qualifiers.add( new AnnotationLiteral<Default>() {} );
                qualifiers.add( new AnnotationLiteral<Any>() {} );
                return qualifiers;
            }

            @Override
            public Class<? extends Annotation> getScope() {
                return Dependent.class;
            }

            @Override
            public Set<Class<? extends Annotation>> getStereotypes() {
                return Collections.emptySet();
            }

            @Override
            public Set<Type> getTypes() {
                Set<Type> types = new HashSet<Type>();
                types.add(c);
                types.add(Object.class);
                return types;
            }

            @Override
            public boolean isAlternative() {
                return false;
            }

            @Override
            public boolean isNullable() {
                return false;
            }

            @Override
            public Object create(CreationalContext ctx) {
                Object instance = it.produce(ctx);
                it.inject(instance, ctx);
                it.postConstruct(instance);
                return instance;
            }

            @Override
            public void destroy(Object instance, CreationalContext ctx) {
                it.preDestroy(instance);
                it.dispose(instance);
                ctx.release();
            }

        } );
    }
}

我还必须扫描我的 jar 中的 bean 类,但这没什么大不了的。找到类后,我将其包含在 getBeanClasses() 列表中。

现在我正在寻找关于如何在运行时包含 JPA 实体的解决方案。

但是现在这个问题已经解决了。

于 2013-07-21T14:16:20.927 回答
0

该类用于与应用程序服务器集成。CDI 旨在为应用程序在启动时加载所有内容。要做你正在寻找的事情,你必须启动一个新的 Weld 实例并传递所有内容并自己进行引导。老实说,我不知道在您的应用程序中执行此操作的含义,但我可以告诉您,这会给您带来很大的麻烦。

于 2013-07-05T14:39:40.840 回答