EJBのローカルインターフェイスを選択するにはどうすればよいですか?
質問
次のEJB(ejb3を使用)があるとします:
@Stateless(name="Queries")
@Remote(Queries.class)
@Local(Queries.class)
public final class QueriesEJB implements Queries {
...
}
このクラスは、ローカルとリモートの両方のインターフェースを介して利用できます。
このEJBのローカルインターフェイスをアプリの別の部分に挿入するにはどうすればよいですか
具体的には、 local インターフェースを選択する@EJBアノテーションを作成する方法がわかりません。たとえば、次のもので十分ですか?
@EJB(name="Queries") private Queries queries;
特に、@ EJBの 'beanInterface'プロパティで区別するためだけに、ローカルとリモートのインターフェイスを別々に作成することは避けたいと思います。
解決
仕様によると、同時にリモートとローカルのインターフェースを持つことはできません。ただし、スーパーインターフェースを作成し、そこにすべてのメソッドを配置してから、2つのサブインターフェースを作成します。それが終わったら、単に@EJBを使用します。この方法では、インターフェイスを1つだけ維持する必要があります。
編集:「EJB3仕様の簡略化」のセクション3.2を参照してください。 http://jcp.org/aboutJava/communityprocess/final/jsr220/index .html
他のヒント
EJBがデプロイされると、コンテナはインターフェースを見て、ローカルおよびリモートのインターフェースを識別します。この例では、EJBコンテナはすでにローカルインターフェイスを使用していると言えます。この場合、コンテナにはローカルインターフェイスを使用する選択肢があるため、リモートインターフェイスを使用しても意味がありません。
ローカルインターフェースのJNDI名を@EJBアノテーションのパラメーターとして使用するようにしてください。
@EJB(name="java:comp/env/ejb/EntitySupplierLocal")
上の例では、インターフェイス名にlocalを追加しました。あなたの場合、正しい名前を取得するためにJNDIコンテキストを確認する必要があります。
通常、ビジネスメソッドが定義されているベースインターフェイスを使用し、ローカルおよびリモートインターフェイスを拡張することをお勧めします。したがって、メソッドを複製する必要はなく、ローカルアクセスとリモートアクセスの機能を個別に拡張できます。
public interface Queries () { .. }
@Local
public interface QueriesLocal extends Queries () { .. }
@Remote
public interface QueriesRemote extends Queries () { .. }
以前のコメントのソリューションは、Jboss上のEJB 3.0と完全に互換性がありません。
このエラーは簡単に取得できます:
org.jboss.ejb3.common.resolvers.spi.NonDeterministicInterfaceException:
beanInterface specified, Queries, is not unique within EJB QueriesEJB
これのみを作成:
public interface Queries () //Local by default
@Remote
public interface QueriesRemote extends Queries () { ... }
動作します