В 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).
Как это сделать?
Просто быстрая мысль - если все эти бобами вы хотите реализовать конкретный интерфейс, то они имеют тип этого интерфейса, так что вы могли бы возможно сделать '@Inject Instance экземпляры'. Теперь, поскольку 'Instance' реализует Iterable, вы должны иметь возможность перебирать все экземпляры. –
Siliarus
Проблема все еще есть ** КАК ** Я получаю только те, что находятся в текущем представлении, не зная конкретных имен компонентов (имена EL и/или имена классов) ... ??? – Kawu
Я не знаком с Seam3, но «Context context = beanManager.getContext (ViewScoped.class);' возвращает допустимый «контекст»? (то есть не null или исключение). Если эта часть работает, я могу опубликовать ответ, как использовать ее для получения активных активных компонентов. – BalusC