Цитата из раздела 4.9.2.1 спецификации EJB 3.2:
@Stateless
public class A implements Foo { ... }
@Stateless
public class B extends A implements Bar { ... }
Предполагая, что Foo и Bar являются локальными бизнес-интерфейсами, а дескриптор развертывания отсутствует, сессионный компонент A предоставляет локальный бизнес-интерфейс Foo а сессионный компонент B предоставляет панель локального бизнес-интерфейса, но не Foo.
Сессионному компоненту B потребуется явно включить Foo в набор представлений, которые должен применить этот интерфейс. Например:
@Stateless
public class A implements Foo { ... }
@Stateless
public class B extends A implements Foo, Bar { ... }
В вашем примере MyBean
, определенный как EJB, не предоставляет MyInterface
и, как следствие, не вводится в Instance<MyInterface>
.
Есть два способа справиться с этим:
- объявить EJB как реализующие
MyInterface
; - аннотировать EJB с помощью
@Local(MyInterface.class)
Предупреждение для подхода с @Local
- этот EJB будет удовлетворять только тем точкам внедрения, которые используют один из интерфейсов, предоставленных в качестве параметра для аннотации. Вы не сможете ввести его в
@Inject
MyBean bean;
Кроме того, вы не сможете преобразовать введенный прокси в любой другой тип.