3

編集:以下のコメントに示されているように、CDIインジェクションポイントを@EJBの使用から@Injectの使用に変更しました。参考までに。


私には2つのEARプロジェクトがあり、どちらも基本的に同じです。それらの唯一の違いは、必要に応じて、いくつかのクライアント固有の実装です。しかし、私は問題を抱えています。

これは私が持っているものです:

EAR#1には、次のモジュールが含まれています。

web.war 
ejb-default.jar
ejb-client-1.jar

EAR#2には、次のモジュールが含まれています。

web.war
ejb-default.jar
ejb-client-2.jar

ejb-defaultには、次のものが含まれています。

@Singleton
@Startup
public class ApplicationSettingsBean implements ApplicationSettingsBeanLocal

現在、EAR#1の場合、ejb-client-1.jarは空である可能性があるため、EJBインジェクションではejb-defaultにあるものをすべて使用する必要があります。

ただし、EAR#2の場合、デフォルトの実装をクライアント固有の実装でオーバーライドしたいと思います。例えば:

@Singleton
@Startup    
@Alternative
public class ApplicationSettingsBean implements ApplicationSettingsBeanLocal {

また、ejb-client-2に次のbeans.xmlエントリを作成しました。

<beans xmlns="http://java.sun.com/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
    <alternatives>
        <class>com.client2.ejb.ApplicationSettingsBean</class>
    </alternatives>
</beans>

@Alternative実装は、そのような実装が存在する場合に注入されると思います。インジェクションポイントで@Defaultが指定されている場合は、デフォルトの実装(ejb-default)をインジェクションする必要があります。しかし、それは起こりません:

    // Inject the alternative implementation
    @Inject
    private ApplicationSettingsBeanLocal appSettingsBean;

このCDIでは、デフォルトが注入されており、代替ではありません。これは予期された動作ではありません。

4

2 に答える 2

4

Alternativesを指定する必要があるbeans.xmlは、ejb-client-2.jarではなくejb-default.jar内にある必要あります

CDI仕様(1.1ですが、以前の実装にも適用可能)は、5.1章で次のように述べています。

モジュールがBeanアーカイブであり、そのBeanアーカイブで代替が明示的に選択されていない限り、モジュール内のクラスまたはJSP / JSFページへのインジェクション、ルックアップ、またはEL解決に代替は使用できません。

つまり、Beanを使用するクラスの同じモジュールで代替を選択する必要があります。

于 2014-11-12T09:47:42.350 に答える
3

何が起こっているのか疑問に思っている人のために、これはCDIとEJB(EE5)インジェクションを組み合わせたものです。そのため、最初のエラーが発生します。代替案はCDIのアイデアであり、@EJBはそれらを認識しません。

代替の代わりにデフォルトを使用する理由は、それがインジェクションで使用されている修飾子であるためです(代替には@Defaultが含まれていません)。これは基本的に、CDIに、必要なインスタンスを正確に認識していることを示します。これは、インジェクションで使用しているのと同じ修飾子を持つインスタンスです。このようなことを処理する最良の方法は、必要なインスタンスを正確に把握していて、それらの修飾子をインジェクションに追加しない限り、修飾子なしで@Injectを使用することです(実装クラスの同じもの)。

于 2012-10-04T22:54:56.917 に答える