Question

j'ai un EJB comme suit:

public class Bar() {

     private String s;

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

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

}
  1. Comment puis-je injecter ce grain en utilisant le constructeur d'arguments dans un autre Foo classe?

  2. Ensuite, je définis le Foo classe en tant qu'EJB, dans le but d'effectuer la DI pour cela dans une autre classe (par exemple, un WebServlet).Comment puis-je injecter un Foo instance de classe en passant un String pour bien configurer Bar arg-constructeur comme dépendance intérieure?

  3. Existe-t-il une meilleure façon de définir Bar afin d'atteindre les points ci-dessus ?

Était-ce utile?

La solution

L'injection de constructeur annotée indique à CDI que chaque fois que quelqu'un demande l'injection d'une instance de Bar, il doit utiliser le constructeur marqué avec @Inject.

Le conteneur CDI essaie ensuite d'obtenir des instances pour tous les paramètres de constructeur requis et échoue, car il ne peut pas gérer "String".Il ne sait tout simplement pas de quelle chaîne vous parlez.

Vous devez aider le conteneur à résoudre la dépendance en utilisant un producteur et un qualificateur pour lui dire quelle chaîne vous voulez.Je viens de vous donner ici la solution la plus simple possible :

public class Bar {

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

Et puis une autre classe (il n’est pas nécessaire que ce soit une classe différente, mais elle est beaucoup plus lisible) :

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

Autres conseils

@Inject ne fonctionne que lorsque vous vous injectez "managed" objets.La chaîne n'est pas un objet géré, donc cela ne fonctionnera pas.

Cependant, l'exemple suivant devrait fonctionner (j'ai utilisé spring ici.Utilisez le code d'initialisation DI en fonction de la bibliothèque que vous utilisez) :

@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;
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top