In einer Java EE 6, CDI 1.1.x, Seam 3 etc. Umgebung müssen wir alle CDI-Beans der aktuellen Ansicht finden (@ViewScoped
). Was ich bisher versucht, ist mit:Wie finden Sie CDI-Beans von/in der aktuellen Ansicht (Scope)?
@Named
@ViewScoped
public class ViewHelper
{
@Inject
private BeanManager beanManager;
public doSomethingWithTheBeanInstances()
{
Set<Bean<?>> beans = this.getBeanManager().getBeans(
Object.class, new AnnotationLiteral<Any>(){}
);
// do something
...
}
}
Doch diese gibt alle Bohnen er verwaltet.
Ich muss nur die im Rahmen der aktuellen Ansicht finden und - das wäre ideal - nur diejenigen, die eine bestimmte Schnittstelle implementieren (vererbt über mehrere Hierarchieebenen).
Wie ist es zu machen?
Hinweis da CDI keine Aussicht Umfang hat, verwenden wir Seam 3 Lage sein, alle Bohnen unserer Sicht-scoped wie annotieren:
@Named
@ViewScoped
public class ResultManagerColumnHandler extends BaseColumnHandler
{
....
}
Die oben eine Instanz zu suchen wäre (Die @ViewScoped
ist ein CDI Ersatz von Seam 3).
Wie kann es gemacht werden?
Nur ein kurzer Gedanke - wenn alle diese Bohnen Sie bestimmte Schnittstelle implementieren möchten, dann haben sie die Art dieser Schnittstelle, so könnte man vielleicht tun '@Instanz Instanzen'. Da "Instance" Iterable implementiert, sollten Sie nun in der Lage sein, alle Instanzen zu durchlaufen. –
Siliarus
Das Problem ist immer noch ** WIE ** bekomme ich nur diejenigen innerhalb der aktuellen Ansicht, ohne die spezifischen Bean-Namen (EL-Namen und/oder Klassennamen) zu kennen ... ??? – Kawu
Ich bin nicht vertraut mit Seam3, aber 'Context context = beanManager.getContext (ViewScoped.class);' einen gültigen 'Context' zurückgeben? (d. h. nicht null oder eine Ausnahme). Wenn dieser Teil funktioniert, kann ich eine Antwort posten, wie er verwendet wird, um die aktuell aktiven Beans zu erhalten. – BalusC