Java &引用;“未满足的依赖关系”;在尝试将EJB注入另一个组件时出现UnsatifiedResolutionException
我试图实现JavaEE的托管执行器Java &引用;“未满足的依赖关系”;在尝试将EJB注入另一个组件时出现UnsatifiedResolutionException,java,jakarta-ee,ejb,Java,Jakarta Ee,Ejb,我试图实现JavaEE的托管执行器ManagedExecutorService,以提交可调用的任务,其中每个任务调用注入的bean方法 我正在使用Instance类使容器知道任务对象,但是当执行get()时,会引发以下异常: 原因:javax.ejb.EJBException: org.jboss.weld.exceptions.unsatifiedResolutionException:weld-001334: 使用限定符@Default的MyTask类型的未满足依赖项 我在WildFly 1
ManagedExecutorService
,以提交可调用的任务,其中每个任务调用注入的bean方法
我正在使用Instance
类使容器知道任务对象,但是当执行get()
时,会引发以下异常:
原因:javax.ejb.EJBException:
org.jboss.weld.exceptions.unsatifiedResolutionException:weld-001334:
使用限定符@Default的MyTask类型的未满足依赖项
我在WildFly 14上运行这个
注入的bean:
@Stateless
public class MyBean {
public void print() {
System.out.println("MyBean printed");
}
}
任务:
@Stateless
public class MyTask implements Callable<String> {
@Inject
MyBean myBean;
@Override
public String call() throws Exception {
System.out.println("MyTask called");
myBean.print();
return "Task called";
}
}
@无状态
公共类MyTask实现可调用{
@注入
蚕豆;
@凌驾
公共字符串调用()引发异常{
System.out.println(“调用MyTask”);
myBean.print();
返回“调用任务”;
}
}
任务调用程序:
@Stateless
public class TestBean {
@Inject
Instance<MyTask> myTaskInstance;
@Resource
private ManagedExecutorService executor;
public void test() throws InterruptedException, ExecutionException {
List<Callable<String>> tasks = new ArrayList<>();
MyTask task = myTaskInstance.get(); // <------- Exception is thrown here
tasks.add(task);
MyTask task2 = myTaskInstance.get();
tasks.add(task2);
List<Future<String>> taskResults = null;
taskResults = executor.invokeAll(tasks);
List<String> results = new ArrayList<>();
for(Future<String> taskResult : taskResults) {
results.add(taskResult.get());
}
}
}
@无状态
公共类TestBean{
@注入
实例myTaskInstance;
@资源
私有ManagedExecutorService执行器;
public void test()引发InterruptedException,ExecutionException{
列表任务=新建ArrayList();
MyTask task=myTaskInstance.get();//问题在于,使用MyTask作为实现Callable的EJB,您已经从这个bean的“bean类型”中删除了MyTask类本身,这意味着它不能被注入到@injectmytask xxx
“客户机”中,具体规则如下:
18.2.2.会话Bean的Bean类型
会话bean的无限制bean类型集包含bean的所有本地接口及其超级接口。如果会话bean具有无接口视图,则无限制bean类型集包含bean类和所有超类。此外,java.lang.Object是每个会话bean的bean类型
这就是为什么Weld没有找到有效的MyTaskbean来满足对TestBean客户端的注入
您可以通过添加@LocalBean
注释,为MyTaskEJB提供一个无接口视图,例如:
@Stateless
@LocalBean
public class MyTask implements Callable<String> {
有关无接口视图的快速参考,请参阅,有关更多讨论,请参阅帖子。如何返回可调用?可调用是一个接口更新的答案引用规范。为什么任务需要是EJB?只要它可以注入另一个EJB(示例中的MyBean),它就不必是EJB.看起来有点像你在发明消息驱动的bean
public class MyTask {
@Inject
MyBean myBean;
MyCallable callable = new MyCallable();
public Callable getCallable() {
return callable;
}
private class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
System.out.println("MyTask called");
myBean.print();
return "Task called";
}
}
}
public class TestBean {
// ...
MyTask task = myTaskInstance.get();
tasks.add(task.getCallable())
// ...
}