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 {
...
}