2016-05-10 13 views
1

Ich biete die Implementierung einer injizierten Service-Schnittstelle zur Laufzeit über eine producer in meiner App.Wie wählt man eine spezifische Bean-Implementierung, ohne das Qualifikationsmerkmal zu verwenden?

Kürzlich wurde eine andere Implementierung der gleichen Service-Schnittstelle von jemandem in einem kollaborierenden Team erstellt und diese Klasse wurde in einem Jar hinzugefügt, den ich in meiner Anwendung nicht vermeiden kann. Dies wirft daher ambiguous dependency exception, die ich offensichtlich durch einen CDI-Qualifier auf meiner Producer-Methode und am Injektionspunkt lösen kann. Ich wollte fragen, ob es noch einen anderen Weg gibt, diesen Overhead zu vermeiden. Kann ich meine @Produces-Methode als Standardimplementierung verwenden, damit der Container die zweite Implementierung ignoriert? Ich fügte @Default Annotation zusammen mit @Produces Annotation auf der Producer-Methode hinzu, um zu überprüfen, ob dies das Problem löst, da jede Injektion standardmäßig mit @Default annotiert ist. Aber das hat nicht funktioniert.

+0

Vielleicht mit @Any Qualifier? Dies ist gelegentlich auch ein Qualifier, aber eingebettet. Wir verwenden es oft, wenn wir eine Implementierung zur Laufzeit auswählen müssen. Irgendeine Art von Plugins. Aber Sie werden natürlich eine andere Möglichkeit brauchen, um Ihre Implementierung in der Sammlung zu finden. – temaleva

Antwort

1

Sie können die folgenden Optionen verwenden, um den Overhead zu vermeiden, um ein neues Qualifikationsmerkmal für eine neue Implementierung zu erstellen.

  1. Verwenden Sie die integrierte inBedingung @Named, die Sie eine Implementierung von String angeben können. (Verwendet jedoch keine sichere CDI-Injektionsfunktion)

  2. Erstellen Sie ein Qualifikationsmerkmal mit dem Attribut enum. Jeder Enum-Wert repräsentiert eine Implementierung. Welche Implementierung injiziert werden soll, wird durch dieses Enum-Attribut festgelegt. (Injection ist sicher ein. Siehe this für ein Beispiel)

0

Wenn Sie nicht die zweite Implementierung @Vetoed mit Anmerkungen versehen kann, würde ich eine CDI Erweiterung schreiben, die die Klasse über ProcessAnnotatedType

private void vetoSecondImpl(@Observes ProcessAnnotatedType<YourSecondImpl> pat) { 
    pat.veto(); 
} 

Vetos Hier ist eine Referenz von der Spezifikation: http://docs.jboss.org/cdi/spec/1.2/cdi-spec.html#init_events