2008年6月10日火曜日

EJB3.0のセッションBeanをJNDIで取得する方法

ここにいろいろ書いてある
https://glassfish.dev.java.net/javaee5/ejb/EJB_FAQ.html


ローカルEJBの場合

クライアントコンテナがインジェクションしてくれる場合、@EJBアノテーションを書く。@EJBのname属性は<ejb-ref-name>に相当。指定しなければルールに従って自動的につけられる。

@EJB(beanInterface=FooLocal.class)

Webフレームワークなどを使っていてServletに自分のアノテーションをつけられない場合はweb.xmlで参照名の定義をする。

<ejb-local-ref>
    <ejb-ref-name>ejb/fooejb</ejb-ref-name>
    <local>abc.def.FooLocal</local> <!-- ローカルインターフェイスの完全修飾名 -->
    <ejb-link>FooBean</ejb-link> <!-- EJBのJNDI名 -->
</ejb-local-ref>

Contextから取得

InitialContext ctx = new InitialContext();
FooLocal foo = (FooLocal)ctx.lookup("java:comp/env/ejb/fooejb");



リモートEJBの場合

クライアントコンテナを使う場合は@EJBアノテーションでインジェクションされる

@EJB(beanInterface=FooRemote.class)

クライアントコンテナを使わない場合JNDIから自前でルックアップする。

props = JNDIリモート参照の設定。後述。
InitialContext ctx = new InitialContext(props);
FooRemote foo = (FooRemote)ctx.lookup("com.example.FooRemote");

JNDIの設定

クラスパスにjndi.propertiesファイルを含めるか、InitialContextの引数にPropertiesを渡す。また、クライアント側プログラムのCLASSPATHにサーバ製品に対応するライブラリを含める。

設定するプロパティ

GrassFishの場合

org.omg.CORBA.ORBInitialHost=hostname
org.omg.CORBA.ORBInitialPort=3700
ホスト、ポートのデフォルトはlocalhost:3700

ライブラリ

appserv-rt.jar
javaee.jar

CLASSPATHに明示的に書く場合は上記の2つだけでいいが、appserv-rt.jarのMANAFEST.MFでさらに以下のファイルが指定されているのでappserv-rt.jarと同じディレクトリに入れておく

appserv-ext.jar
appserv-deployment-client.jar
jmxremote_optional.jar
appserv-rt_ja.jar
appserv-rt_zh.jar
appserv-rt_fr.jar
appserv-rt_de.jar
appserv-rt_es.jar
appserv-rt_it.jar
appserv-rt_sw.jar
appserv-rt_ko.jar
appserv-rt_zh_TW.jar
appserv-rt_zh_CN.jar


JNDI名の定義

EJB3.0のデフォルトのJNDI名はリモートインターフェイスの完全修飾名。
JNDI名を指定する場合は@Stateless, @Statefullの引数に書く
@Stateless(mappedName="FooEJB")

参考記事

Java EE 5チュートリアル:EJB3 セッション・ビーン編(2) 〜EJBクライアント〜