残念ながら、@EJB アノテーションはローカル (単一の JVM) インジェクションに対してのみ機能します。別のホストの場合は、プレーンな JNDI ルックアップにフォールバックする必要があります。
私の知る限り、WebLogicサーバー( here )のように、リモート依存性注入を実行するための独自の移植不可能なソリューションがいくつかありますが、私はそのようには行きません。
JNDI ルックアップは機能しますが、非常に複雑でかなり醜いです。
- サーバー ベンダーを知り、そのクライアント ライブラリをアプリの依存関係に追加する必要があります。
- アプリケーションを次のように汚染します。
- 暗号化されたベンダー固有の URI 形式
- ベンダー固有のネーミング サービスのポート番号 (多くの場合、デフォルトは 1099 ですが、確かなことは誰にもわかりません...)
- ベンダー固有の jndi 名パターン
以下は、リモート JBoss 4.x インスタンスでホストされている Bean のルックアップの例です。
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY,
"org.jnp.interfaces.NamingContextFactory");
properties.put(Context.URL_PKG_PREFIXES,
"org.jboss.naming:org.jnp.interfaces");
properties.setProperty(Context.PROVIDER_URL, "localhost:1099");
InitialContext context = null;
ClientDataAccessRemote cl = null;
try {
context = new InitialContext(properties);
cl = (ClientDataAccessRemote) context.lookup("ClientDataAccess/remote");
} catch (NamingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
EJB が EAR の一部であることを考えると、EJBean の名前の前に EAR の名前を付ける必要があります。
cl = (ClientDataAccessRemote) context.lookup("MyEAR/ClientDataAccess/remote");
上記の例は JBoss 固有のものであり、修正なしで JBoss 5.x シリーズで動作するかどうかさえわかりません。
どうやら EJB 3.1 仕様は jndi の命名にいくらかの統一をもたらしたようですが、私はまだそれを扱う喜びを感じていません。
この例に少し不安を感じた場合は、EJB を Web サービス (SOAP または REST スタイル) として公開することをお勧めします。それ自体に問題がありますが、少なくとも移植可能です。