Java &引用;“未满足的依赖关系”;在尝试将EJB注入另一个组件时出现UnsatifiedResolutionException

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

我试图实现JavaEE的托管执行器
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())

    // ...
}