Использование @Inject Instance для получения EJB и CDI-бинов, которые реализуют указанный c интерфейс - PullRequest
0 голосов
/ 05 февраля 2020

В нашем приложении есть компоненты CDI (аннотация @ApplicationScoped) и EJB (@Stateless annotaion), которые структурированы следующим образом:

MyInterface
    MyAbstractClass
       MyBean (CDI or EJB)

Я использую ниже, чтобы получить все компоненты (CDI и EJB) ) в моем приложении, которое реализует MyInterface :

@Inject
Instance<MyIterface> beans;

Здесь я вижу две странные вещи:

  • Я получаю только компоненты CDI, а не компоненты EJB .
  • При создании EJB-компонента, который реализует непосредственно интерфейс MyInterface , без расширения MyAbstractClass , чем в этом случае этот компонент получает инъекцию, произведенную выше.

Как я могу получить все бины, CDI и EJB, с помощью инъекции выше?

1 Ответ

2 голосов
/ 12 февраля 2020

Цитата из раздела 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;

Кроме того, вы не сможете преобразовать введенный прокси в любой другой тип.

...