2012-01-29 13 views
7

これまでのところ、私はほとんどいつもインターフェイスのないEJBを使って作業していましたが、@Localアノテーションの必要性について少しは理解しています。この例を考えてみましょう:EJB 3.1。 @Local注釈は必要ですか?

public interface MyBeanIntf { void doStuff(); } 

@Stateless 
public class MyBean implements MyBeanIntf { public void doStuff(){ } } 

MyBeanIntf@Localとしてマークされるべきか?私は@Localとしてそれに注釈を付けていない場合でも、私はまだきちんとUIコントローラにそれを注入するDIを使用することができますので、私は、それから任意の利益が表示されない:

@Named 
@SessionScoped 
public class TestController implements Serializable { 

    // injection works perfectly, even when MyBeanIntf is not marked as @Local 
    @Inject 
    private MyBeanIntf myBean; 

    // or even like this: 
    // @EJB 
    // private MyBeanIntf myBean; 

} 

はのは、それがより複雑にしてみましょう:

public interface MyBeanIntf { void doStuff(); } 
public class MySuperBean implements MyBeanIntf { public void doStuff() { } } 

@Stateless 
public class MyBean extends MySuperBean { } 

MyBean、有効なLocal EJB豆と考えていますか?私は間接的にインターフェイスを実装するので、いくつかの疑問があります。

答えて

8

あなたのEJBが何らかのインタフェースを実装していて、(EJBでもインタフェース自体にも)指定していない場合は、どのインタフェースが@Localであると仮定されているのか(@ Remote、@Local)です。

ので、あなたのコード:

public interface MyBeanIntf { void doStuff(); } 

@Stateless 
public class MyBean implements MyBeanIntf { public void doStuff(){ } } 

は、次のように意味的に同じです:

@Local 
public interface MyBeanIntf { void doStuff(); } 

@Stateless 
public class MyBean implements MyBeanIntf { public void doStuff(){ } } 

それはあなたの質問の後半になると、私はそのセクション4.9.2.1セッションBeanと思いますEJB 3.1 FR仕様のスーパークラスは面白いでしょう。 fooとbarを想定すると、

@Stateless 
public class A implements Foo { ... } 

@Stateless 
public class B extends A implements Bar { ... } 

は、ローカルビジネスインタフェースです:(それは正しくない可能性がありますので)私の理解から、あなたのBeanがあるため、次の抜粋で有効なローカルインタフェースを暴露すると考えるべきではないと思われます 関連付けられたデプロイメント記述子がない場合、セッションBean Aはローカル ビジネスインターフェイスFooを公開し、セッションBean Bはローカルビジネス インターフェイスバーを公開しますが、Fooは公開しません。

セッションBean Bは、そのインターフェイスが適用される 公開ビューのセットにFooを明示的に含める必要があります。

アップデート:さらにとして

スペックから1本のより抜粋:

セッションBeanクラスは 自身セッションBeanクラスであるスーパーを持つことが許可されています。ただし、注釈の処理に適用される特別な規則はありません。 、またはこの場合のデプロイメント 記述子はありません。特定の セッションBeanクラスを処理する目的で、スーパークラスがセッションBeanクラスであるかどうかにかかわらず、すべてのスーパークラス処理は同一である( )。

+0

お返事ありがとうございます。仕様へのリンクに関しては、私はまだいくつかの疑問を持っています。セッションBean自体であるスーパークラスについては、明示的に説明します。しかし、 '@ Stateless'や' @ Stateful'アノテーションのない抽象クラスであればどうでしょうか? – jFrenetic

+0

確かに、私は100%でそれについては分かりませんが、編集されたポストを見てみてください。多分役立つかもしれません。 –

+1

おかげさまで、ありがとうございます。私はその部分を自分で読んだが、何とかそれを逃した。 – jFrenetic

関連する問題