Domanda

Ho un EJB come segue:

public class Bar() {

     private String s;

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

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

}
.

    .
  1. Come posso iniettare quel bean usando il costruttore arg-coving in un'altra classe Foo?

  2. Quindi, definisco la classe Foo come EJB, con l'obiettivo di eseguire il DI per questo in un'altra classe (ad esempio, un server web).Come posso iniettare un'istanza di classe Foo passando un String per configurare correttamente il costruttore arg-coving up Bar come Inner-Dependency ?

  3. C'è un modo migliore per definire Bar per ottenere punti sopra?

È stato utile?

Soluzione

L'iniezione annotata del costruttore indica il CDI che ogni volta che qualcuno richiede un'istanza di una barra da iniettare, dovrebbe utilizzare il costruttore contrassegnato con @Inject.

Il contenitore CDI tenta quindi di ottenere casi per tutti i parametri del costruttore richiesti e fallisce, perché non può affrontare "stringa".Non sa solo quale stringa intendi.

Devi aiutare il contenitore a risolvere la dipendenza utilizzando un produttore e un qualificatore per dirgli in quale corda vuoi.Ti do solo la soluzione più semplice possibile qui:

public class Bar {

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

E poi un'altra classe (non deve essere una classe diversa, ma è molto più leggibile):

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

Altri suggerimenti

@Inject funziona solo quando si inietta oggetti "managed".La stringa non è un oggetto gestito, quindi questo ha vinto; t lavoro.

Tuttavia, il seguente esempio dovrebbe funzionare (ho usato qui primavera. Utilizzare il codice di Initializaton in base alla libreria che stai utilizzando):

@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;
    }
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top