Реализовать интерфейс с несколькими EJB - PullRequest
0 голосов
/ 20 февраля 2019

Учитывая следующий интерфейс:

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
     }
}

Теперь я хочу запустить один или другой компонент в зависимости отсостояние.Каков наилучший способ добиться этого?

Это то, что я безуспешно пытался:

@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 с квалификаторами @ По умолчанию

ОБНОВЛЕНИЕ Что-то, что я заметил;если я удалю implements MyRunnable из бобов, ошибок при запуске не будет.

1 Ответ

0 голосов
/ 20 февраля 2019

Поскольку вы реализуете один и тот же интерфейс в Bean1 и Bean2, они отображаются на MyRunnable (теперь они @Local bean-компоненты).Поскольку Weld не знает, как решить эту проблему, вам необходимо указать, какой бин вы хотите внедрить.Правильный путь будет:

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