2 つの EJB を持つアプリケーションを作成したいと考えています。このアプリケーションは、OpenEJB と WebLogic 10.3 の両方で実行できます。EJB は両方とも EJB 3.0 です。
OpenEJB と WebLogic の両方で実装する方法は知っていますが、同じコードを使用して両方の環境にデプロイしたいという問題があります。WebLogic の Context.INITIAL_CONTEXT_FACTORY は weblogic.jndi.WLInitialContextFactory ですが、OpenEJB はそうではないため、問題は JNDI ルックアップの方法だと思います。
現在の考えでは、最初の EJB はサービス ロケータを使用して 2 番目の EJB をルックアップし、サービス ロケータは 2 つの環境で異なる INI を読み取ります。他の提案はありますか?注釈を使用するだけで、外部 INI ファイルを使用する必要がない解決策はありますか。
2 つの EJB は 1 つのコンテナーに存在しますが、将来、一方が別のコンテナーに移動する可能性があります。
2011/10/06 更新
デビッドの提案で、私はいくつかの変更を加えました。コードは JUnit コードではなく POJO です。@LocalClient と initialContext.bind("inject", this); は使用しません。(JUnitコードに2つのコードを入れました)
resources\META-INF\application-client.xml を配置 ( のみを含む)
リソース\jndi.properties を配置
jdbc/OrderDB = new://Resource?type=DataSource jdbc/OrderDB.JdbcDriver = oracle.jdbc.OracleDriver jdbc/OrderDB.JdbcUrl = jdbc:oracle:thin:@*.*.*.*:1521:test jdbc/OrderDB.JtaManaged = false jdbc/OrderDB.UserName = test jdbc/OrderDB.Password = test
参照コード
InitialContext ctx= new InitialContext(); ctx.lookup("jdbc/" + name);
以下はログです。OpenEJB はデータベースの JNDI を作成します。また、Eclipse デバッグ モードを使用して「ctx」の内容を確認し、MyProps で「jdbc/OrderDB」を見つけます。
INFO - Configuring Service(id=jdbc/OrderDB, type=Resource, provider-id=Default JDBC Database)
しかし、最終的にはまだ検索できません。私も ctx.lookup(name), ctx.lookup("java:comp/env/jdbc/" + name) を使用しようとしましたが、結果は同じです。
javax.naming.NameNotFoundException: Name "jdbc/OrderDB" not found.
2011/10/12更新
Java EE6より前のDavidのコメントに基づいて、唯一の解決策は、サービスロケーターといくつかの構成を使用して、WebLogicとOpenEJBの間で異なるJNDIを使用することだと思います。以下はテスト結果です。
DB: WebLogic: OrderDB、OpenEJB: openejb:Resource/jdbc/OrderDB
トランザクション マネージャ: WebLogic: javax.transaction.TransactionManager、OpenEJB: java:comp/TransactionManager
EJB : どちらも接頭辞なしで EJB 名を検索するだけです