实现与多个 EJB 的接口
Implement interface with multiple EJBs
给定以下界面:
public interface MyRunnable {
public MyResponse run(int x);
}
它由两个@Stateless
bean实现:
@Stateless
public class Bean1 implements MyRunnable {
public MyResponse run(int x) {
// some logic
}
}
@Stateless
public class Bean2 implements MyRunnable {
public MyResponse run(int x) {
// some logic
}
}
现在,我想 运行 一个 bean 或另一个取决于条件。实现该目标的最佳方法是什么?
这是我试过的,没有成功:
@Stateless
@LocalBean
public class MainBean {
@Inject
private Bean1 bean1;
@Inject
private Bean2 bean2;
public void someMethod(int y) {
MyRunnable runnable = null;
if (y == 1)
runnable = bean1;
else
runnable = bean2;
runnable.run(5);
}
}
代码可以编译,但它给我(在 Wildfly 中)一个启动错误:
WELD-001408: Unsatisfied dependencies for type Bean1 with
qualifiers @Default
更新
我注意到的东西;如果我从 bean 中删除 implements MyRunnable
,则没有启动错误。
由于您在 Bean1
和 Bean2
中实现相同的接口,因此它们被映射到 MyRunnable
(它们现在是 @Local
beans)。由于 Weld 不知道如何解决这个问题,您需要指定要注入的 bean。正确的方法是:
@Stateless
public class MyBean {
@EJB(beanName = "Bean1")
MyRunnable bean1;
@EJB(beanName = "Bean2")
MyRunnable bean2;
public void run() {
MyRunnable r = Math.random() < 0.5d ? bean1 : bean2;
r.run(10);
}
}
给定以下界面:
public interface MyRunnable {
public MyResponse run(int x);
}
它由两个@Stateless
bean实现:
@Stateless
public class Bean1 implements MyRunnable {
public MyResponse run(int x) {
// some logic
}
}
@Stateless
public class Bean2 implements MyRunnable {
public MyResponse run(int x) {
// some logic
}
}
现在,我想 运行 一个 bean 或另一个取决于条件。实现该目标的最佳方法是什么?
这是我试过的,没有成功:
@Stateless
@LocalBean
public class MainBean {
@Inject
private Bean1 bean1;
@Inject
private Bean2 bean2;
public void someMethod(int y) {
MyRunnable runnable = null;
if (y == 1)
runnable = bean1;
else
runnable = bean2;
runnable.run(5);
}
}
代码可以编译,但它给我(在 Wildfly 中)一个启动错误:
WELD-001408: Unsatisfied dependencies for type Bean1 with qualifiers @Default
更新
我注意到的东西;如果我从 bean 中删除 implements MyRunnable
,则没有启动错误。
由于您在 Bean1
和 Bean2
中实现相同的接口,因此它们被映射到 MyRunnable
(它们现在是 @Local
beans)。由于 Weld 不知道如何解决这个问题,您需要指定要注入的 bean。正确的方法是:
@Stateless
public class MyBean {
@EJB(beanName = "Bean1")
MyRunnable bean1;
@EJB(beanName = "Bean2")
MyRunnable bean2;
public void run() {
MyRunnable r = Math.random() < 0.5d ? bean1 : bean2;
r.run(10);
}
}