2017-02-02 1 views
3

Dans un environnement Java EE 6, CDI 1.1.x, Seam 3 etc., nous devons trouver tous les beans CDI de la vue actuelle (@ViewScoped). Ce que j'ai essayé jusqu'à présent est en utilisant:Comment trouvez-vous les beans CDI de/dans la vue actuelle (portée)?

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

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

     // do something 
     ... 
    } 
} 

Cependant, cela revient tous les haricots qu'elle gère.

Je n'ai besoin de trouver que les dans la portée de la vue actuelle et - ce serait idéal - seulement ceux qui implémentent une interface spécifique (héritée sur plusieurs niveaux de hiérarchie).

Quelle est la façon de le faire?

Remarque depuis CDI n'a pas de portée de vue, nous utilisons Seam 3 pour pouvoir annoter tous nos haricots scope vue comme:

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

Le ci-dessus serait une instance de chercher (le @ViewScoped est un remplacement CDI par Seam 3).

Comment cela peut-il être fait?

+0

Juste une pensée rapide - si tous les haricots que vous souhaitez mettre en œuvre une interface spécifique, ils ont le type de cette interface, vous pouvez peut-être faire 'Instance @Inject instances'. Maintenant, parce que 'Instance' implémente Iterable, vous devriez pouvoir parcourir toutes les instances. – Siliarus

+0

Le problème est toujours ** COMMENT ** puis-je obtenir seulement ceux dans la vue actuelle sans connaître les noms de bean spécifiques (noms EL et/ou noms de classe) ... ??? – Kawu

+2

Je ne suis pas familier avec Seam3, mais est-ce que 'Context context = beanManager.getContext (ViewScoped.class);' retourne un 'Context' valide? (c'est-à-dire non null ni une exception). Si cette partie fonctionne, alors je peux poster une réponse comment l'utiliser pour obtenir les beans actuellement actifs. – BalusC

Répondre

0

Je ne suis pas familier avec Seam, mais du point de vue CDI, c'est ce que j'essayerais. Cependant, le haricot, il importe que cela ne fonctionnera que si beanManager.getContext(ViewScoped.class); retourne une instance de contexte valide pour vous:

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

Vous avez également demandé d'obtenir que les haricots qui mettent en œuvre certaines interface. Pour cela, modifier simplement la ligne de code récupérer tous les haricots avec le type désiré:

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

Oui, merci. J'essayais le code dans mon IDE pour AppScoped et j'ai oublié d'éditer cette pièce après le collage. – Siliarus