EJBクライアントからEJBを呼び出すには、EJBのJNDI名とビジネスインタフェース名との対応関係を定義する必要があります。この情報をEJB参照と呼びます。以下の方法で指定したJNDI名について、EJB参照を定義する必要があります。
リモートマップのejbタグのapplicationアトリビュート
EJBCallFactoryクラスのcreateUjiSessionCallメソッドの引数
EJB参照は以下のどちらかの方法で定義します。
デプロイメント記述 (Webアプリケーションはweb.xml、EJBアプリケーションはejb-jar.xml)
@EJBアノテーション
リモートビジネスインタフェースを使って呼び出すセションBeanはejb-refタグで、ローカルビジネスインタフェースを使って呼び出すセションBeanはejb-local-refタグで記述します。
以下はweb.xmlの記述例です。
<?xml version="1.0" encoding="UTF-8"?> <web-app 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/web-app_2_5.xsd" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> ... <!-- リモートビジネスインタフェースを使って呼び出す セションBeanの情報を記述します。ローカルビジネス インタフェースの場合はejb-local-refタグを使います。--> <ejb-ref> <!-- セションBeanに付けるJNDI名です。 先頭の java:comp/env/ を省いて指定します。--> <ejb-ref-name>ejb/OfficeBean</ejb-ref-name> <!-- EJBの種別です。セションBeanの場合は Sessionです。--> <ejb-ref-type>Session</ejb-ref-type> <!-- リモートビジネスインタフェース名です。 ローカルビジネスインタフェースの場合はlocalタグを 使います。--> <remote>ejboffice.ejb.Office</remote>
</ejb-ref> ... </web-app>
EJB参照を定義するには、クラスに@EJBアノテーションを付加します。name属性でJNDI名を、beanInterface属性でビジネスインタフェースのClassオブジェクトを指定します。JNDI名は先頭の java:comp/env/ を省いて指定します。
なお、@EJBアノテーションが使用できるクラスは、サーブレットクラス、セションBeanクラスなどであり、Java EEの仕様で決められています。
以下はEJBアプリケーションHelloBeanから、別のセションBeanを呼び出す場合の記述例です。
package hello.ejb;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import com.fujitsu.uji.ejb.bean.UjiSimpleStatelessBean;
@Stateless
@EJB(name="ejb/OfficeBean", beanInterface=ejboffice.ejb.Office.class)
public class HelloBean extends UjiSimpleStatelessBean implements Hello {
...
}