ローカルとリモートの Enterprise JavaBeans (EJB) に別個のインターフェースを定義する

インターフェースを同時にローカルとリモートにすることはできません。ただし、すべてのメソッドを単一のインターフェースで定義してから、そのインターフェースを拡張し、アノテーションまたはエレメントで参照できる別個のローカル・インターフェースおよびリモート・インターフェースを作成できます。

この規則により、同じクラスにおいて javax.ejb.Localjavax.ejb.Remote の両方のアノテーションで使用されているインターフェースにフラグを立てます。 また、ejb-jar.xml ファイルの同じ session エレメント内の同じインターフェースを参照している business-local エレメントおよび business-remote エレメントにもフラグを立てます。

以下の Java コードでは、javax.ejb.Local アノテーションおよび javax.ejb.Remote アノテーションに対して、MyInterface.class の参照にフラグが立てられます。

public interface MyInterface () { .. }
@Stateless(name="MyEJB")
@Remote(MyInterface.class)
@Local(MyInterface.class)
public final class MyEJB implements MyInterface {
    ...
}

以下の ejb-jar.xml ファイルでは、この規則は business-local エレメントおよび business-remote エレメントにフラグを立てます。

<session>
    <ejb-name>MyEJB</ejb-name>
    <business-local>com.ibm.sample.MyInterface</business-local>
    <business-remote>com.ibm.sample.MyInterface</business-remote>
    <ejb-class>com.ibm.sample.MyEJB</ejb-class>
    <session-typegt;Stateless</session-type>
    <transaction-typegt;Container</transaction-type>
 </session>

この問題を解決するには、以下のように、インターフェースを拡張してローカル用とリモート用の別個のインターフェースを作成し、アノテーションまたはエレメントでそのインターフェースを参照します。

public interface MyInterfaceLocal extends MyInterface() 
{ .. }
public interface MyInterfaceRemote extends MyInterface() 
{ .. }