实现具有多个EJB的接口

时间:2019-02-19 21:06:48

标签: java java-ee java-8 ejb

给出以下界面:

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或另一个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:类型为Bean1的依赖项不令人满意,具有   限定词@Default

更新 我注意到的东西;如果我从Bean中删除implements MyRunnable,则不会出现启动错误。

1 个答案:

答案 0 :(得分:2)

由于您正在Bean1Bean2中实现相同的接口,因此它们被映射到MyRunnable(它们现在是@Local bean)。由于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);
  }
}