2010-03-09 5 views
2

Интересно, могу ли я добавить в список (без состояния) beans, что все реализуют специальный интерфейс.Можно ли ввести список компонентов, реализующих интерфейс, используя Java EE

Например, я имею на контрактный модуль

public interface ResetService { 
    void reset(MyContext context); 
} 

чем я два модуля, которые реализующие этот интерфейс. И один модуль, который должен назвать все реализации:

@EJBs 
private List<ResetService> resetServices; 

void resetAllModules(MyContext context) { 
    for (ResetService resetService : resetServices) 
    resetService.reset(context); 
} 

Очень важно, что все звонки в основной транзакции и вызывающий сброс должен знать, если вызов сброса завершен. Поэтому я не могу использовать JMS и темы.

Я думаю, это невозможно, или?

ответ

2

Невозможно с аннотациями. Ваш лучший вариант здесь состоит в том, чтобы перебрать массив имен JNDI и сделать поиск JNDI для каждого, чтобы подать ваш List. На всякий случай, возможно, посмотрите на предыдущие вопросы, например this one, если вы хотите попробовать сделать более динамичным (я не уверен, что это будет хорошая идея).

3

Приватный ответ неправильный. Вы можете динамически вводить динамические данные с помощью аннотации @Any и класса javax.enterprise.inject.Instance. Вот простой пример http://coders-kitchen.com/2013/01/24/jee-and-dynamic-dependency-injection/

+0

Я думаю, что речь шла о EJBs. И ваши blogposts показывают использование аннотаций CDI. Использование и обработка на серверах полностью различаются между CDI и EJB. –

+1

Предыдущий ответ не был ошибочным 4 года назад. С последней спецификацией J2EE (версия 6) был добавлен CDI, который предлагает решение. – Konstantin

2

Вы можете получить все бобы типа по:

@Inject 
    BeanManager beanManager; 

    public Set<ResetService> getAllResetServices() { 
     return beanManager.getBeans(ResetService.class); 
    } 
Смежные вопросы