Weld-SE没有启动,没有发现bean存档

时间:2017-11-21 02:32:01

标签: java cdi weld jboss-weld weld-se

我正在尝试在Quartz Application中初始化CDI-SE上下文,所以我有以下依赖(maven):

  <dependency>
                <groupId>org.jboss.weld.se</groupId>
                <artifactId>weld-se-core</artifactId>
                <version>2.3.4.Final</version>
            </dependency>

在我的JobQuartz中,我有方法execute(),其中包含以下内容:

public void execute(JobExecutionContext context) throws JobExecutionException {
        Weld weld = new Weld();
        WeldContainer container = weld.initialize();
        service = container.instance().select(MyService.class).get();
        service.go();
        weld.shutdown();
    }

但是我收到了以下错误:

Caused by: java.lang.IllegalStateException: WELD-ENV-002009: Weld SE container cannot be initialized - no bean archives found

我的项目是一个WAR,所以我把beans.xml文件放在/src/main/webapp/META-INF/里面,看看内容:

<?xml version="1.0"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       version="1.2" bean-discovery-mode="all">

</beans>

我将文件复制到/src/main/resource/META-INF,但我收到了同样的错误。

2 个答案:

答案 0 :(得分:1)

在评论部分进行了一些对话后,我想我已经足够理解回答你了。

首先,您不应该自己启动Weld SE容器,因为您有两个并排运行的容器(不打算/支持) - 一个SE和一个&#34; classic&#34 ;,由容器处理。坚持使用容器处理的容器,轻松启动。

现在,我发现你缺少一些范围激活手段。如果你正在使用一些较新版本的Weld,你可以使用一个拦截器,它会在方法之前激活RequestContext(我认为你是之后的那个)并在之后将其拆除。您所需要的只是依赖于Weld API (无论如何都包含在WFLY中),然后您只需用它来注释您的方法或类。

对于上述内容,您需要Weld 2.4.x.请注意,您可以简单地修补WildFly。这些修补程序位于Weld website的底部,可以找到操作方法here

如果你使用Weld 3 / CDI 2.0,那么甚至还有一个内置的bean(RequestContextController)可以让你控制这个生命周期。

其他选择是Deltaspike,正如Johm Ament指出的那样,但这要求你带来另一种依赖。

答案 1 :(得分:0)

如果你要做的是启动请求上下文,你有几个解决方案。

  1. 使用DeltaSpike的Quartz Integration for CDI - http://deltaspike.apache.org/documentation/scheduler.html

  2. 使用BoundRequestContext以编程方式启动和停止上下文(它是您可以注入的CDI bean)。

  3. 我强烈推荐DeltaSpike方法,因为它会处理作业自动启动上下文所需的所有设置。