再コンパイルせずに注入するEJBを選択する

@Local インターフェースの2つの実装があるとします

@Local
public interface LocalInterface {
}

@Stateless
public class MyFirstImplementation implements LocalInterface {
}

@Stateless
public class MySecondImplementation implements LocalInterface {
}

そして、私は使用したいもの(MyFirstImplementationまたはMySecondImplementation)を選択する、すなわち、再コンパイルせずにプロジェクトを(実行時または外部構成プロパティを使用して)選択したいと思います。

public class MyClass {
   @EJB
   LocalInterface local;
}

1つの実装が選択されると、変更する必要はありません。 JBoss 5.1を使用しています。

3

3 答え

もう1つの方法は、JNDIを使用してEJB参照を見つけることです。自動注入に頼るのではなく、他の誰かを助ける場合もあります。

public class MyClass {
   LocalInterface local;

   @PostConstruct
   public void init() {
       local = findImplementation();
   }

   private LocalInterface findImplementation() {
       try {
            InitialContext context = new InitialContext();
            String ejbPath =//read from an external property
            return (LocalInterface) context.lookup(ejbPath);
       } catch ... { ... }
   }
}

This is what I finally did, because with JBoss 5 (< Java EE 6, EJB 3.0) you can not make use of the useful @Produces annotation. I set PedroKowalski's answer as accepted as CDI annotations seems to be the better solution if you do not have other restrictions.

2
追加された
残念ながら、 MyClass が存在するWARの web.xml は、 宣言を提供する必要があります。 JNDIツリーでBeanを検索します。 のサブ要素は、 java:comp/env の下でEJBをどこに見つけるかを示します。 web.xml の変更は、明らかにビルド時の変更です。
追加された 著者 lotz,
2
追加された
ありがとうございました。 DTDによれば、ホーム/リモートインタフェースを指定する必要があるため、 "MyClass"がEJB自体でない場合、ejb-jarソリューションは動作しないようです。 CDIアプローチは、間違っていない場合にのみ、JEE 6で有効です。
追加された 著者 Guido García,
@GuidoGarcíaあなたが正しいです - MyClassはEJBクラスでなければなりません。 CDIソリューションは、構成を他の場所(データベースなど)に配置することもできるため、柔軟性があります。さらに、 @Inject を使用するとどこでも動作します。これはXMLスキーマであり、DTDではありません。ホーム/リモートインタフェースは必須ではありません。使用しているEJBのバージョンによって異なります。
追加された 著者 Piotr Nowicki,

PedroKowalskiによって概説された方法は、これを行う典型的な方法です。 「外部構成プロパティー」に関するもう1つのトリックは、EJBを保持する生成するjarで1つの実装だけが終了するようにBuilderを構成することです。

したがって、クラスを再コンパイルしたりソースコードを変更する必要はありませんが、別の実装を選択するためにjarを再構築する必要があります。

1
追加された
ありがとうArjan。現在のアプローチは使用ですが、jarの再構築は本番環境ではオプションではないため、有効ではありません。
追加された 著者 Guido García,