1

CDI で JBoss 7.1.1 を使用しています。

JNDI に ServiceAccount という名前のステートレス Bean があります。これが実際のサービスの実装です。モック サービスである ServiceAccountMock という名前の別の Statelss Bean があります。どちらも同じインターフェースから継承され、service.ear にパッケージ化されています。

私がやりたいことは、bean.xml で代替サービスとしてモック サービスを宣言し、サービスの耳を再デプロイすると、すべてのクライアントが (クライアント側で何も変更せずに) モック バージョンを表示することです。

service.ear をデプロイすると、JBoss は次のように言います。

java.lang.IllegalArgumentException: JBAS011046: A component named 'ServiceAccount' is already defined in this module

これは本当です。両方のサービスが同じ方法で宣言されています (@Stateless(name="ServiceAccount"))。

モック バージョンの名前を変更すると、使用する EJB をクライアント側で変更する必要があります (変更したくありません)。

誰もそれを行う方法を知っていますか?

4

2 に答える 2

8

同じアプリケーションに同じ名前の 2 つの Bean をデプロイできるとは思いません。

Bean のクライアントがローカルのみの場合は、CDI タイプの注入選択を使用する必要があります。

  • 本当に名前が必要な場合は、Bean の名前を削除するか、別の名前を付けます (モックには、実際の実装とは異なる名前が付けられます)。
  • @Alternative注釈をモックに保持します。
  • インジェクション ポイントでは、インターフェイスを変数の型として使用します (おそらく、@Injectアノテーションの代わりにアノテーションを使用すると@EJB役立つ場合があります)。

EJB 仕様と CDI はまだ完全には一致していません。EJB には、アプリケーション全体で一意である必要がある名前のような要素があり、CDI 代替機能では考慮されません。

したがって、EJB 名インジェクションの選択と CDI 代替インジェクションの選択を混在させることはできないと思います。

于 2013-01-21T23:27:33.683 に答える
0

最初に、 で注釈を付けて、指示されていない場合は使用しないようにコンテナーに指示する必要がありServiceAccountMockます@Alternative

@Stateless(name="ServiceAccount")
@Alternative
public class ServiceAccountMock{
....
}

次にbeans.xml、A/S にモック実装を選択するように指示する必要があります。

...
<alternatives>
    <class>xx.yy.ServiceAccountMock</class>
</alternatives>
...
于 2013-01-21T12:07:41.547 に答える