0

次の EJB があるとします (ejb3 を使用):

@Stateless(name="Queries")
@Remote(Queries.class)
@Local(Queries.class)
public final class QueriesEJB implements Queries {
    ...
}

このクラスは、ローカル インターフェイスとリモート インターフェイスの両方から利用できます。

この EJB のローカル インターフェイスをアプリの別の部分に挿入するにはどうすればよいですか?

具体的には、ローカルインターフェイスを選択する @EJB アノテーションを作成する方法がわかりません。例えば、以下で十分でしょうか?

@EJB(name="Queries") private Queries queries;

特に、@EJB の「beanInterface」プロパティを介して区別するためだけに、個別のローカル インターフェイスとリモート インターフェイスを作成することは避けたいと考えています。

4

3 に答える 3

3

仕様によると、リモートとローカルのインターフェイスを同時に使用することはできません。ただし、スーパーインターフェイスを作成し、そこにすべてのメソッドを配置してから、2つのサブインターフェイスを作成します。それが終わったら、@EJBを使用するだけです。このように、1つのインターフェースのみを維持する必要があります。

編集: http://jcp.org/aboutJava/communityprocess/final/jsr220/index.htmlの「EJB3仕様の簡略化」のセクション3.2を参照してください。

于 2009-03-19T16:55:15.427 に答える
1

以前のコメントのソリューションは、Jboss上のEJB3.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 () { ... }

できます

于 2009-06-09T14:34:02.207 に答える
1

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 () { .. }
于 2009-03-11T18:45:26.777 に答える