1

projectAprojectB、およびprojectCEclipse Maven プロジェクトがあります。

  • ProjectA内容:
    • IMyApiインターフェース。
    • 「空の」META-INF\beans.xmlファイル。
  • ProjectB内容:
    • IMyConfigインターフェース。
    • MyConfigJndiの実装IMyConfig
    • MyApiImplIMyApiプロパティを持つ の実装@Inject private IMyConfig config;
    • 「空の」META-INF\beans.xmlファイル。
  • ProjectC内容:
    • としてマークされた のMyConfigAlter実装。IMyConfig@Alternative
    • Weld SE を初期化し、 Beanを取得するMainクラス (およびメソッド) 。IMyApi
    • セクションに記載されているMETA-INF\beans.xml場所。MyConfigAlteralternatives

ここで、Mainクラスを実行すると、 Bean が (インスタンスIMyApiとして) 正常に取得されます。MyApiImplしかし、そのようなインスタンスには、そのプロパティで、代替バージョンの代わりにインスタンスがconfig注入されています ( )MyConfigJndiMyConfigAlter

Eclipse Luna + M2Eclipse を使用しています。

私は何を間違っていますか?

@Specializes更新:代わりに使用すると問題が解決することがわかりましたが@Alternative、それでも適切な解決策ではないと思います(状況によっては、「デフォルト」の実装にアクセスできない場合があります)。

更新 2:

私はWeld-se、2.2.10.Finalを使用しています:

<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se</artifactId>
    <version>2.2.10.Final</version>
    <scope>runtime</scope>
</dependency>

そして、初期化は単純です

WeldContainer weld =
  new Weld().
    initialize();
IMyApi myApi =
  weld.
    instance().
    select(
      IMyApi.
        class).
    get();
4

2 に答える 2

0

これを解決する別の方法は、 http://docs.jboss.org/weld/reference/2.2.11.Final/en-US/html/environments.html#_bean_archive_isolation_2-Dorg.jboss.weld.se.archive.isolation=falseから使用することです。

これが発生する理由は、クラスパス上の各 JAR が独自の Bean アーカイブになるためです。1.2 の CDI 仕様には SE 仕様が含まれていないため、このモードでクラスパスがどのように動作するかについての定義はありません。各 JAR に一意のクラスローダーがないため、これは必ずしも SE アプリの設計方法ではありません。

于 2015-12-02T12:28:06.250 に答える