我正在尝试在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
,但我收到了同样的错误。
答案 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)
如果你要做的是启动请求上下文,你有几个解决方案。
使用DeltaSpike的Quartz Integration for CDI - http://deltaspike.apache.org/documentation/scheduler.html
使用BoundRequestContext
以编程方式启动和停止上下文(它是您可以注入的CDI bean)。
我强烈推荐DeltaSpike方法,因为它会处理作业自动启动上下文所需的所有设置。