gpt4 book ai didi

java - 尝试将 EJB 注入(inject)另一个组件时出现 "Unsatisfied dependencies"和 UnsatisfiedResolutionException

转载 作者:行者123 更新时间:2023-11-30 10:05:57 24 4
gpt4 key购买 nike

我正在尝试实现 Java EE 的托管执行器 ManagedExecutorService 以提交可调用任务,其中每个任务都会调用注入(inject)的 bean 方法。

我正在使用 Instance 类让容器知道任务对象,但是当执行 get() 时抛出以下异常:

Caused by: javax.ejb.EJBException: org.jboss.weld.exceptions.UnsatisfiedResolutionException: WELD-001334: Unsatisfied dependencies for type MyTask with qualifiers @Default

我在 WildFly 14 上运行它。

注入(inject)的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";

}
}

任务调用者:

@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());
}

}
}

为什么会抛出异常,如何解决这个问题?类路径中是否缺少库?

最佳答案

问题在于,将 MyTask 作为实现 Callable 的 EJB,您已经从“bean 类型”中删除了 MyTask 类本身这个bean,这意味着它不能注入(inject)到@Inject MyTask xxx“客户端”,根据CDI 2.0 spec中的规则。 :

18.2.2. Bean types of a session bean

The unrestricted set of bean types for a session bean contains all local interfaces of the bean and their superinterfaces. If the session bean has a no-interface view, the unrestricted set of bean types contains the bean class and all superclasses. In addition, java.lang.Object is a bean type of every session bean.

这就是为什么 Weld 找不到有效的 MyTask bean 来满足对 TestBean 客户端的注入(inject)。

您可以通过添加 @LocalBean 注释为 MyTask EJB 提供无接口(interface) View ,例如:

@Stateless
@LocalBean
public class MyTask implements Callable<String> {

或者,您可以删除 implements Callable 并像这样重构:

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())

// ...
}

参见 here有关无界面 View 的快速引用,以及 this发布更多讨论。

关于java - 尝试将 EJB 注入(inject)另一个组件时出现 "Unsatisfied dependencies"和 UnsatisfiedResolutionException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54970504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com