Weld-SE 未启动,未找到 bean 存档
Weld-SE not starting , no beans archive found
我正在尝试在我的 Quartz 应用程序中初始化 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
,但我得到了同样的错误。
如果您要做的是启动一个请求上下文,您有几个解决方案。
将 DeltaSpike 的 Quartz 集成用于 CDI - http://deltaspike.apache.org/documentation/scheduler.html
使用 BoundRequestContext
(它是您可以注入的 CDI bean)以编程方式启动和停止上下文。
我强烈推荐 DeltaSpike 方法,因为它会处理作业自动启动上下文所需的所有设置。
经过评论区的一些交流,我觉得我明白了,可以回答你了。
首先,你不应该自己启动 Weld SE 容器,因为你有两个容器 运行 并排(不是 intended/supported)——一个 SE 和一个 "classic",由容器处理。坚持使用容器处理的,它可以毫不费力地为您启动。
现在,我发现您缺少一些激活范围的方法。如果您使用的是较新版本的 Weld,则可以使用拦截器,它将在方法之前激活 RequestContext
(我想这就是您所追求的)并在之后将其拆除。您所需要的只是 对 Weld API 的依赖(无论如何都包含在 WFLY 中),然后您只需用它注释您的方法或 class。
以上你需要焊接2.4.x。请注意,您可以非常简单地修补您的 WildFly。补丁位于 Weld website and the how-to can be found here.
的底部
如果您要使用 Weld 3/CDI 2.0,那么甚至还有一个内置 bean (RequestContextController
) 允许您控制此生命周期。
正如 Johm Ament 指出的那样,其他选项是 Deltaspike,但这需要您引入另一个依赖项。
我正在尝试在我的 Quartz 应用程序中初始化 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
,但我得到了同样的错误。
如果您要做的是启动一个请求上下文,您有几个解决方案。
将 DeltaSpike 的 Quartz 集成用于 CDI - http://deltaspike.apache.org/documentation/scheduler.html
使用
BoundRequestContext
(它是您可以注入的 CDI bean)以编程方式启动和停止上下文。
我强烈推荐 DeltaSpike 方法,因为它会处理作业自动启动上下文所需的所有设置。
经过评论区的一些交流,我觉得我明白了,可以回答你了。
首先,你不应该自己启动 Weld SE 容器,因为你有两个容器 运行 并排(不是 intended/supported)——一个 SE 和一个 "classic",由容器处理。坚持使用容器处理的,它可以毫不费力地为您启动。
现在,我发现您缺少一些激活范围的方法。如果您使用的是较新版本的 Weld,则可以使用拦截器,它将在方法之前激活 RequestContext
(我想这就是您所追求的)并在之后将其拆除。您所需要的只是 对 Weld API 的依赖(无论如何都包含在 WFLY 中),然后您只需用它注释您的方法或 class。
以上你需要焊接2.4.x。请注意,您可以非常简单地修补您的 WildFly。补丁位于 Weld website and the how-to can be found here.
的底部如果您要使用 Weld 3/CDI 2.0,那么甚至还有一个内置 bean (RequestContextController
) 允许您控制此生命周期。
正如 Johm Ament 指出的那样,其他选项是 Deltaspike,但这需要您引入另一个依赖项。