JavaEE: внедрить @Alteriative to Insance <Interface>без реализации по умолчанию - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть ejb-JAR, состоящий из нескольких классов, подсчитывающих разные значения [Counter1, Counter2, ...], и все они реализуют один и тот же интерфейс [ICountable].Также частью этого JAR является класс, зацикливающийся на всех существующих счетчиках и возвращающий его значения [CounterCollector].

Теперь у меня есть два других WAR с EJB, упакованными в него.

Мое намерение состоит в том, чтобыиметь первую WAR только с использованием Counter1 и Counter3.Другая WAR с использованием Counter1 и Counter2.(Реальный сценарий немного сложнее, но я думаю, что достаточно информации, чтобы понять идею)

Я хотел бы использовать @ Alternative-Annotation на всех счетчиках и добавлять только включенные альтернативы в CounterCollector следующим образом:

...

@Inject
private Instance<ICountable> counters;

public List<Integer> getCounts()
{
    List<Integer> c = new ArrayList<>();
    for (ICountable countable : counters) {
         c.add(countable.count());
    }
    return c;
}

...

В WAR1 я активирую счетчики 1 и 3 в файле beans.xml:

<alternatives>
  <class>Counter1</class>
  <class>Counter3</class>
</alternatives>

во втором файле WAR.ans.xml:

<alternatives>
  <class>Counter1</class>
  <class>Counter2</class>
</alternatives>

AsПока реализации ICounter НЕ аннотированы как @Alternative, все работает как положено (кроме того, что, очевидно, все счетчики являются триггерами).

Как только я аннотирую ICounters с помощью @Alternative, они вообще не вводятся.Независимо от того, включены ли они с помощью beans.xml.

Разве невозможно внедрить @ Alternative-Annotated классы в javax.enterprise.inject.Instance?

Использую ли я @Alternativeв некотором смысле это не работа, или я что-то упустил?

1 Ответ

0 голосов
/ 28 декабря 2018

Ваша проблема не связана с Instance<T>, речь идет только о архивах бинов и выборе альтернатив.

Полагаю, ваша WAR выглядит примерно так:

WEB-INF/
    beans.xml
    classes/
    lib/
        ejb.jar

и WEB-INF/beans.xml - этоместо, где вы активируете свои альтернативы.

Теперь важно отметить, что WEB-INF/classes и ejb.jar - это два разных архива бинов .Выбор альтернативы с помощью beans.xml влияет только на архив компонентов, содержащий этот файл.

Так что в вашем случае все, что вы делаете в WEB-INF/beans.xml, не повлияет на lib/ejb.jar

Вы можете попробовать выбрать альтернативы на уровне приложения , используя @Priority аннотации на методы производителя или на производные классы.

@ApplicationScoped
@Priority(Interceptor.Priority.APPLICATION)
public class Counter1SelectedForWar extends Counter1 { ... }
...