Pregunta

tengo un EJB como sigue:

public class Bar() {

     private String s;

     public Bar() {
         this.s = "bar";
     }

     @Inject public Bar(String s) {
         this.s = s;
     }

}
  1. ¿Cómo puedo inyectar ese frijol usando el constructor-arg en otro Foo ¿clase?

  2. Luego defino el Foo clase como EJB, con el objetivo de realizar la DI para ello en otra clase (por ejemplo, un WebServlet).¿Cómo puedo inyectar un Foo instancia de clase pasando un String para configurar correctamente Bar constructor arg como dependencia interna?

  3. ¿Existe una mejor manera de definir Bar para lograr los puntos anteriores?

¿Fue útil?

Solución

La inyección de constructor anotada le dice a los CDI que cada vez que alguien solicita una instancia de la barra que se inyectará, debe usar el constructor marcado con @Inject.

El contenedor de CDI intenta obtener instancias para todos los parámetros de constructor requeridos y falla, ya que no puede lidiar con "cadena".Simplemente no sabe qué cadena te refieres.

Debe ayudar al contenedor que resuelva la dependencia utilizando un productor y un calificador para decirle qué cadena desea.Solo le doy la solución más simple posible aquí:

public class Bar {

 @Inject 
 public Bar(@Named("myString") String s) {
     this.s = s;
 }
}

y luego otra clase (no tiene que ser una clase diferente, pero es mucho más legible):

public class MyStringProducer {
  @Produces
  @Named("myString")
  public String getMyString() {
    return ...; // whatever you want ... read JSON, parse properties, randomize ...
  }
}

Otros consejos

@Inject solo funciona cuando está inyectando objetos "managed".La cadena no es un objeto administrado, por lo que esto ganó; T trabajo.

Sin embargo, el siguiente ejemplo debería funcionar (he usado la primavera aquí. Utilice el código di inicializaton de acuerdo con la biblioteca que está utilizando):

@Named
public class Foo {

    @Inject
    Bar bar;

    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext("com.pkg1");
        Foo foo = (Foo)ctx.getBean("foo");

        System.out.println(foo.bar.getString());

    }


}

@Named
public class Bar {
    private String s;
    public Bar() {
        this.s = "bar";
    }
   @Inject 
   public Bar(Bar1 bar1) {
        this.s = bar1.getS();
    }
    public String getString() {
        return s;
    }
}

@Named
class Bar1 {
    private String s="bar1";
    public String getS() {
        return s;
    }
}

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top