javax.inject.Instance kann mehrdeutige Abhängigkeiten nicht auflösen

Hallo Leute,

ich brauche leider eure Hilfe.

Ich benutze die @java x.inject.Instance Annotation um zur Laufzeit über alle Implementierungen eines Interfaces zu iterieren. Hiermit wird ein ID Generator für meine Entities realisiert:

@Startup
public class EntityIdGeneratorImpl implements EntityIdGenerator {

    @Inject
    @Any
    private Instance<IdFetcher> fetcher;
    
    public EntityIdGeneratorImpl() {
        
    }


//... 

}```

Bis vor zwei Wochen hat das auch ausgesprochen gut funktioniert.




Dann ist mein Laptop abgestürzt. :scheiterhaufen:



Ich habe mein System jetzt neu aufgesetzt, m.E. alles wieder so wie vorher: Oracle JDK 8, Glassfish 4.1, Netbeans 8.0.1, Maven Projekt wieder ausgecheckt. Aber mein Injection-Mechanismus funktioniert nicht mehr, der Iterator von "fetcher" bleibt leer. 
Beim herumspielen mit verschiedenen Typen und den Methoden ".isAmbiguous()" und ".isUnsatisfied()" habe ich festgestellt, dass der Lookup immer fehlschlägt, wenn es mehrere Implementierungen eines Interfaces gibt. Wenn das selbe Interface von zwei Klassen implementiert wird, dann ist das Ergebnis "ambiguous = false" und "unsatisfied = true", sobald ich eine der beiden Implementierungen lösche ist das Ergebnis "ambiguous = false" und "unsatisfied = false". Im letzteren Fall kann ich auch auf eine Instanz zugreifen.

Ich habe die letzten Tage ziemlich viel ausprobiert, (unter anderem auch eine mehrfache Umkonfiguration und Löschen der beans.xml, @Any Annotation, keine @Any Annotation, Field Injection, Method Injection, Constructor Injection, CDI, EJB...), und ich befürchte ich sehe zur Zeit den Wald vor lauter Bäumen nicht mehr. Habt ihr so einen Fall vielleicht schon einmal selbst gehabt und vielleicht gelöst? Was würdet ihr versuchen, oder habt ihr eine Vermutung?

Viele Grüße,
Tim

Hallo Tim,

ist das nicht ein Fall für die Named-Annotation?

https://docs.oracle.com/javaee/7/api/javax/inject/Named.html

Irgendwo muss die Entscheidung getroffen werden, wenn eine Instanz injeziert werden soll und bei zwei Kandidaten sollte es eine eindeutige Entscheidung geben. Deshalb mit Named einen Namen setzen.

Hallo Unregistered,

Ja, es muss zwar eine Entscheidung getroffen werden, aber das passiert mit „Instance“ zur Laufzeit:

https://docs.oracle.com/javaee/6/api/javax/enterprise/inject/Instance.html

In certain situations, injection is not the most convenient way to obtain a contextual reference. For example, it may not be used when:

•the bean type or qualifiers vary dynamically at runtime, or
•depending upon the deployment, there may be no bean which satisfies the type and qualifiers, or
•we would like to iterate over all beans of a certain type.

Sollte die zu injizierende Instanz „ambiguous“, also mehrdeutig sein, kann ich dies mit instance.isAmbiguous() abfragen und über alle Instanzen iterieren, oder mir nachträglich nur die mit bestimmten Qualifiern aussuchen.

Was ich oben vergessen habe: Die Implementierungen von IdFetcher sind Stateless EJB.