Cómo inyectar programáticamente un Java CDI managed bean en una variable local en un método estático


¿Cómo puedo inyectar programáticamente un Java CDI 1.1+ managed bean en una variable local en un método estático?

Author: XDR, 2014-07-17

6 answers

Para inyectar una instancia de la clase C:

javax.enterprise.inject.spi.CDI.current().select(C.class).get()

Esto está disponible en CDI 1.1 +

 36
Author: XDR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-04 20:22:04

Use por ejemplo esta utilidad class. Básicamente tienes que obtener una instancia de BeanManager y luego agarrar el frijol que quieras de él (imagina algo como buscar JNDI).

Update

También podría usar CDI clase de utilidad ofrecida en CDI 1.1

SomeBean bean = CDI.current().select(SomeBean.class).get();
 12
Author: Petr Mensik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-13 07:18:00

@ BRS

import javax.enterprise.inject.spi.CDI;

...

IObject iObject = CDI.current().select(IObject.class, new NamedAnnotation("iObject")).get();

Con:

import javax.enterprise.util.AnnotationLiteral;

public class NamedAnnotation extends AnnotationLiteral<Named> implements Named {

     private final String value;

     public NamedAnnotation(final String value) {
         this.value = value;
     }

     public String value() {
        return value;
    }
}
 6
Author: XDR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-04 21:36:53

El enlace sugerido por @Petr Mensik es muy útil. Estoy usando el mismo código en mi ejemplo.

Aquí hay una manera de obtener una instancia de la clase en instance methods/static methods. Siempre es mejor codificar para interfaces en lugar de usar el nombre de clase codificado en los métodos.

@Named(value = "iObject ")
@RequestScoped
class IObjectImpl  implements IObject  {.....}

//And in your method

IObject iObject = (IObject) ProgrammaticBeanLookup.lookup("iObject");
.........
//Invoke methods defined in the interface

Esta búsqueda programática de beans puede ser bastante útil cuando se tiene un objeto de ámbito de aplicación con método que requiere una instancia de una clase que puede cambiar con el tiempo. Por lo tanto, es siempre es mejor extraer la interfaz y usar programática bean look up por el bien del acoplamiento suelto.

 2
Author: phoenix,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-04 21:02:27

Debe incluir calificadores:

List<Annotation> qualifierList = new ArrayList();
 for (Annotation annotation: C.class.getAnnotations()) {
   if (annotation.annotationType().isAnnotationPresent(Qualifier.class)) {
     qualifierList.add(annotation);
   }
 }
javax.enterprise.inject.spi.CDI.current()
   .select(C.class, qualifierList.toArray(new Annotation[qualifierList.size()])
   .get()
 0
Author: Manuel Baena García,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-08-24 00:41:15
  • Podría definir un parámetro con el tipo de interfaz de bean en su método estático, y pasar una referencia de implementación adecuada. Eso lo haría más amigable para las pruebas unitarias.
  • Si estás usando Apache Deltaspike, puedes usar BeanProvider#getContextualReference. Es más fácil que conseguir un Javax.empresa.inyectar.Ejemplo, pero, cuidado con los frijoles dependientes (ver javadoc)!
 0
Author: jpangamarca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-16 14:39:52