2017-06-12 3 views
2

Momentan habe ich ein großes Problem mit CDI, wenn ich ein neues Objekt anhand ihrer Annoteitons erstellen möchte.Äquivalent von @Configurable für CDI JavaEE 7

Mit Reflektionen habe ich alle Klassen mit '@Connector' versehen. Danach erstelle ich für jede Klasse ein neues Objekt. Dies funktioniert gut, aber ich möchte einen ServiceHandler in die Objekte injizieren, die versuchen, es über '@Inject' zu injizieren. Das Problem hier ist, dass CDI diese Objekte nicht kennt und sie nicht injizieren kann. Zur Zeit habe ich einen Workaround, um dieses Problem zu lösen, aber das ist nicht wirklich schön. Ich bin neu bei CDI und suche nach einer Entsprechung der Annotation "@Configurable" von Spring.

private Set<ApiDao> determineApiDaos() { 
Set<Class<?>> classes = new Reflections("###packageName###").getTypesAnnotatedWith(Connector.class); 
return FluentIterable.from(classes) 
    .transform(CLASS_TO_API_DAO_FUNCTION) 
    .filter(Predicates.notNull()) 
    .toSet(); 
} 

private ApiDao instantiateApiDao(Class apiDao) { 
try { 
    ApiDao newApiDao = (ApiDao) apiDao.newInstance(); 
    newApiDao.setConfigurationService(configurationService); // Workaround inject service during creation 
    return newApiDao; 
} catch (Exception e) { 
    LOG.error("Could not initialize Connector.", e); 
    return null; 
    } 
} 
+0

Können Sie ein bisschen mehr erklären - warum weiß CDI nicht über diese Klassen? –

Antwort

0

Ihre Frage ist sehr breit. So wird meine Antwort sein.

Versuchen Sie nicht, Spring bei der Arbeit mit Java EE zu imitieren. Es ist nützlich, die CDI-Spezifikationen zu lesen.

Wenn ich Ihr Problem richtig verstehe, haben Sie eine Klasse, die CDI unbekannt ist, aber Sie möchten, dass CDI es injiziert. Dies ist in CDI leicht lösbar. In der Tat viel einfacher als mit Spring. Verwenden Sie producers.

public class ConfigurationServiceProducer{ 

@Produces 
public ConfigurationService produceConfigurationService(){ 
    //Instantiate and return the ConfigurationService accordingly. 
    return new ConfigurationService(); 
} 
} 

Sie können auch Qualifiers verwenden Bohnen Typen wie ConfigurationService zu unterscheiden, falls erforderlich. Wenn Sie den Injektionspunkt in der Producer-Methode tiefer untersuchen müssen, können Sie InjectionPoint als Argument für die Producer-Methode übergeben.

+0

Vielen Dank :-) –

+0

Sie können den Bean Discovery-Modus auch auf "all" in der Datei beans.xml setzen (in Ihrem Projekt überhaupt nicht erforderlich). Auf diese Weise können Sie in einigen Fällen völlig vermeiden, Produzenten zu schreiben oder etwas zu kommentieren. CDI wird nur mit regulären Klassen arbeiten, solange CDI sie instanziieren kann. –

Verwandte Themen