2017-02-02 5 views
3

В Java EE 6, CDI 1.1.x, Seam 3 и т. Д. Среда, нам нужно найти все CDI-компоненты текущего вида (@ViewScoped). То, что я пытался до сих пор использует:Как вы узнаете CDI beans/в текущем представлении (области)?

@Named 
@ViewScoped 
public class ViewHelper 
{ 
    @Inject 
    private BeanManager beanManager; 

    public doSomethingWithTheBeanInstances() 
    { 
     Set<Bean<?>> beans = this.getBeanManager().getBeans( 
      Object.class, new AnnotationLiteral<Any>(){} 
     ); 

     // do something 
     ... 
    } 
} 

Однако это возвращает всех бобов, которыми он управляет.

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

Каким образом это сделать?

Примечание так как КДИ не имеет вид сферы, мы используем Шов 3, чтобы иметь возможность комментировать все с нашей точки зрения в области видимости бобы как:

@Named 
@ViewScoped 
public class ResultManagerColumnHandler extends BaseColumnHandler 
{ 
    .... 
} 

выше будет экземпляром искать (@ViewScoped - замена CDI швом 3).

Как это сделать?

+0

Просто быстрая мысль - если все эти бобами вы хотите реализовать конкретный интерфейс, то они имеют тип этого интерфейса, так что вы могли бы возможно сделать '@Inject Instance экземпляры'. Теперь, поскольку 'Instance' реализует Iterable, вы должны иметь возможность перебирать все экземпляры. – Siliarus

+0

Проблема все еще есть ** КАК ** Я получаю только те, что находятся в текущем представлении, не зная конкретных имен компонентов (имена EL и/или имена классов) ... ??? – Kawu

+2

Я не знаком с Seam3, но «Context context = beanManager.getContext (ViewScoped.class);' возвращает допустимый «контекст»? (то есть не null или исключение). Если эта часть работает, я могу опубликовать ответ, как использовать ее для получения активных активных компонентов. – BalusC

ответ

0

Я не знаком с швом, но с точки зрения CDI, это то, что я попробую. Тем не менее, боб это в голове, что он будет работать только если beanManager.getContext(ViewScoped.class); возвращает действительный экземпляр контекста для вас:

@Inject 
BeanManager bm; 

public List<Object> getAllViewScoped() { 
    List<Object> allBeans = new ArrayList<Object>(); 
    Set<Bean<?>> beans = bm.getBeans(Object.class); 
    // NOTE - context has to be active when you try this 
    Context context = bm.getContext(ViewScoped.class); 

    for (Bean<?> bean : beans) { 
     Object instance = context.get(bean); 
     if (instance != null) { 
      allBeans.add(instance); 
     } 
    } 

    return allBeans; 
} 

Вы также попросили получить только боб, которые реализуют определенный интерфейс. Для этого, просто изменить строку коды извлечения всех бобов с желаемым типом:

Set<Bean<?>> beans = bm.getBeans(MyInterface.class); 
+0

Да, спасибо. Я пытался использовать код в своей среде IDE для AppScoped и забыл отредактировать этот фрагмент после вставки. – Siliarus

Смежные вопросы