読者です 読者をやめる 読者になる 読者になる

スケのブログ

Java, Java EE, OpenAMなどの情報を記述していきます。

Stackoverflowの「EJB 3.1 @LocalBean vs no annotation」を翻訳

間違い指摘歓迎します!

前提

※Localビュー、Remoteビュー、no-interfaceビューの概念を事前に理解する必要があります。以下を参考にしてください。

kenyoiii.hateblo.jp


あとで訳します。
http://stackoverflow.com/questions/7729905/what-is-local-remote-and-no-interface-view-in-ejb

訳しました。

質問

Localビュー、Remoteビュー、no-interfaceビューの違いは理解できています。しかし、no-view(アノテーションなし)とno-interfaceビューの違いが理解できません。
また、なぜ@Localをインターフェースにつけるべきなのでしょうか?インターフェースにアノテーションをつけない場合と違いがありますか?

回答

次のルールがあります。

1. Beanに@LocalBeanがある -> Beanはno-interfaceビューを持つ
2. Beanに@Localがある -> BeanはLocalビューを持つ
3. Beanに@Remoteがある -> BeanはRemoteビューを持つ
4. Beanにアノテーションなし、@Localがあるインターフェースを実装している -> BeanはLocalビューを持つ
5. Beanにアノテーションなし、@Remoteがあるインターフェースを実装している -> BeanはRemoteビューを持つ
6. Beanにアノテーションなし、インターフェースもアノテーションなし -> BeanはLocalビューを持つ
7. Beanにアノテーションなし、インターフェースも実装していない -> Beanはno-interfaceビューを持つ

@LocalBeanや、アノテーションをつけないことでno-interfaceビューを持ったBeanを取得できます。もし、単にno-interfaceビューを取得したいなら、一番楽な方法はアノテーションをつけないことです。また、インターフェースの実装もしないことです。

@LocalBeanがある理由の一つは、interface-viewを持つBeanにno-interfaceビューを持たせるためです。

I imagine the scenario uppermost in the spec authors' minds was one where you have a bean like:


@Stateless
public class UserPreferences {
public String getPreference(String preferenceName);
public Map getPreferences();
}

あなたがしたいことは、それぞれのメソッドをローカルとして公開し、また、粗悪なgetPreferences()をリモートして公開したいことです。

getPreferences()をリモートインターフェースに宣言し、Beanクラスに@LocalBeanをつけるだけで上記のことが実現できます。
この方法ができない場合、それぞれのメソッドをローカルに公開するための、的の外れたローカルインターフェースを作成しなければなりません。

また、ほかの方法を見てみると、@LocalBeanはno-interfaceビューというものがあるため存在します。アノテーションをつけないという選択は手軽な方法です。