編集:以下のコメントに示されているように、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では、デフォルトが注入されており、代替ではありません。これは予期された動作ではありません。