ps0604:
次のインタフェースを考えます:
public interface MyRunnable {
public MyResponse run(int x);
}
それは2つので実装されている@Stateless
豆:
@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
}
}
今、私は条件に応じて、1つの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
UPDATEの私が気づいたことを何か。私は削除する場合はimplements MyRunnable
豆から何の起動エラーはありません。
フライング:
あなたが同じインターフェイスを実装しているので、Bean1
とBean2
彼らはににマッピングされているMyRunnable
(彼らは今ある@Local
豆)。溶接は、これを解決する方法を知らないので、あなたが注入したいどの豆を指定する必要があります。適切な方法は、次のようになります。
@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);
}
}