2017-06-12 8 views
2

現在、私はannotitonsで新しいオブジェクトを作成したいときにCDIに大きな問題があります。CDI JavaEE 7の@Configurableに相当する

私はすべてのクラスを '@Connector'でテジャートしました。その後、私はクラスごとに新しいオブジェクトを作成します。これは正常に動作しますが、 '@Inject'を介して注入しようとするオブジェクトにServiceHandlerを注入したいと考えています。 ここでの問題は、CDIがこれらのオブジェクトを認識せず、それらを挿入できないことです。現在、私はこの問題を解決するための回避策を持っていますが、これは本当にかわいいものではありません。私はCDIの初心者です。私はSpringの@Configurableアノテーションと同等のものを探しています。

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

もう少し説明できますか?なぜCDIはこれらのクラスについて知りませんか? –

答えて

0

あなたの質問は非常に広いです。それで私の答えがあります。

まず、Java EEを使用しているときにSpringを真似しようとしないでください。 CDIの仕様書を読むと便利です。

あなたの問題を正しく理解していれば、CDIには未知のクラスがありますが、CDIにそれを注入させたいと思います。これはCDIで簡単に解決できます。実際、Springよりはるかに簡単です。 producersを使用してください。

public class ConfigurationServiceProducer{ 

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

また、必要に応じて、ConfigurationServiceとして豆の種類を区別するためにQualifiersを使用することができます。プロデューサメソッドでより深く直接注入ポイントを検査する必要がある場合は、InjectionPointをプロデューサメソッドの引数として渡すことができます。

+0

ありがとうございました:-) –

+0

また、bean.xmlファイルのbean検出モードを "all"に設定することもできます(プロジェクトにはまったく必要ありません)。このように、場合によっては、プロデューサを書くことや何かを注釈することを完全に避けることができます。 CDIは、それらをインスタンス化することができる限り、通常のクラスで動作します。 –

関連する問題