Frage CDI-Produzent und Injektion


Ich möchte einen Hersteller in meiner Anwendung verwenden, aber ich bin an dem Punkt fest, wo ich versuche, die Bohne zu injizieren. Ich bekomme den berühmten WELD-001409 Fehler. bitte erhelle mein Verständnis von cdi-Produzent.

Hier ist meine Schnittstelle:

@Named
    public interface MessageSender {
      void sendMessage();
    }

die Bohne:

public class EmailMessageSender implements MessageSender {

  @Override
  public void sendMessage() {
    System.out.println("Sending email message");
  }

}

und der Produzent:

@SessionScoped
public class MessageSenderFactory implements Serializable {

    private static final long serialVersionUID = 5269302440619391616L;

    @Produces
    public MessageSender getMessageSender() {
        return new EmailMessageSender();
    }

}

jetzt spritze ich die Bohne:

@Inject 
MessageSender messageSender;

Wenn ich versuche, das Projekt zu implementieren, bekomme ich den Fehler WELD-001409 und Eclipse sagt auch, dass es mehrere Injektionspunkte gibt.

Es funktioniert mit expliziter Benennung:

@Inject @Named("messageSender")
MessageSender messageSender;

Ist diese Benennung notwendig?


5
2017-09-13 08:25


Ursprung


Antworten:


  1. Ihre EmailMessageSender Klasse implementiert MessageSender und deshalb ist es eine Bohne, die für die Einspritzung mit dem Typ entweder vorhanden ist EmailMessageSender oder MessageSender.

  2. Ihr Producer gibt eine Bean vom Typ zurück MessageSender.

  3. Dein Injektionspunkt will die einzige Bean in der gesamten Anwendung, deren Typ und Qualifikationsmerkmale exakt mit dem Typ und den Qualifiern des Injektionspunkts übereinstimmen.

Von eins und zwei haben Sie zwei Bohnen, die zu einem einzigen Injektionspunkt passen - daher ist das eine zweideutige Abhängigkeit.

Unter dem Strich ist Ihr Produzent absolut sinnlos (abgesehen von dem Fehler) im obigen Beispiel, weil er einfach eine neue Instanz von EmailMessageSender Das ist der gleiche Effekt wie einfach @Inject MessageSender schon seit EmailMessageSender hat den Standardumfang @Dependent.


5
2017-09-13 08:47