2017-02-02 1 views
3

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?

+0

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

+0

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

+2

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

Antwort

0

Ich bin nicht vertraut mit Seam, aber von CDI Standpunkt, das ist, was ich versuchen würde. es jedoch Bohne dagegen, dass es nur funktionieren, wenn beanManager.getContext(ViewScoped.class); eine gültige Kontextinstanz für Sie gibt:

@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; 
} 

Sie fragte auch nur Bohnen zu erhalten, die bestimmte Schnittstelle implementieren. Dazu einfach die Codezeile ändern, dass alle Bohnen mit gewünschten Typ Abrufen:

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

Ja, danke. Ich habe versucht, den Code in meiner IDE für AppScoped und vergessen, dieses Stück nach dem Einfügen zu bearbeiten. – Siliarus

Verwandte Themen