CDI : invoquer un bean CDI dans une classe Java standard

de | mars 10, 2016

L’autre jour, j’ai du mettre en place CDI sur un projet qui ne l’utilisait pas. Le timing étant serré, je ne pouvais pas réécrire toute l’architecture afin de rendre toute les classes injectable avec CDI. L’astuce suivante permet d’invoquer un bean CDI dans une classe Java standard de manière à profiter de toute les fonctionnalités de CDI dans le bean récupéré ( Injection, Producer, Event, Interceptor …).

Pour faire cela, on utilise la classe BeanManager qui permet d’interagir avec les Beans chargés par le conteneur CDI.

Pour récupérer ce BeanManager dans notre classe non CDI, il suffit de faire :


BeanManager beanManager = CDI.current().getBeanManager();

Une fois l’instance du BeanManager récupéré voici une méthode permettant l’invocation de n’importe quel bean CDI.


public <T> T lookupCDIBean(Class<T> cls, Annotation... annotations) {

    Set<Bean<?>> beans = beanManager.getBeans(cls, annotations);

    Bean<?> bean = beanManager.resolve(beans);

    CreationalContext<?> context = beanManager.createCreationalContext(bean);

    if(bean != null) {

        return (T) beanManager.getReference(bean, cls, context);

    } else {

        throw new Exception("Impossible de trouver un bean CDI correspondant à la class " + cls.getName());

    }

}

 

Et nous utilisons cette méthode comme suit :


lookupCDIBean(MonBeanCDI.class);

lookupCDIBean(MonBeanCDI.class, MonQualifier.class);

A bientôt

02

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.