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?
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
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
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