2012-01-22 11 views
1

は、EJB Beanを使用して非常に奇妙な動作です:奇妙なEJBの動作または私は何かが不足していますか?ここ

@Local 
public interface Provider { 
    void test(); 
} 

@Local 
public interface ExtProvider extends Provider { 
    void test2(); 
} 

public abstract class AbstractProvider implements Provider { 
    @Override 
    void test(){ System.out.println("Hello strange " + getTech()); } 
    protected abstract String getTech();   
} 

public abstract class ExtAbstractProvider extends AbstractProvider implements ExtProvider { 
    @Override 
    void test2() { System.out.println("Hello from " + getName());} 
    @Override 
    String getTech() { return "extended EJB";} 
    protected abstract String getName(); 
} 
@Stateless 
public class ProviderBean extends AbstractProvider { 
    @Override 
    protected String getTech() { return "EJB";} 
} 

@Stateless 
public class ExtProviderBean extends ExtAbstractProvider { 
    @Override 
    protected String getName() { return "ext provider";} 
} 

上記のコードによると、私が書く場合:

@EJB Provider provider; // should inject an instance of ProviderBean 
@EJB ExtProvider extProvider; // should inject an instance of ExtProviderBean 

が、2つの作品の誰!この例では、Providerを実装するインスタンスが2つあるため、EJBは毎回作成するインスタンスをEJBが認識していないと言います。そして、奇妙です:コードが動作する。この場合

public class ExtProviderBean extends ExtAbstractProvider implements ExtProvider 
public class ProviderBean extends AbstractProvider implements Provider 

:私たちのように2つのBeanを宣言した場合にのみ動作します。問題は、抽象実装から暗黙的に定義されていても、インプリメンテーションBeanがインタフェースを実装することを明示的に定義する必要があることです。私は何かを逃しているのですか、これは限界ですか?

+0

私はEJB 3.1についてはわかりませんが、コンテナは実際のEJBクラスに対してのみ暗黙的なローカルインタフェースを作成するか、直接実装されたインタフェースを使用すると思います - 特に 'AbstractProvider'は注釈されませんクラスレベル)、EJBと認識される可能性があります。 – Thomas

+0

私には2つの質問があります:抽象クラスに注釈を付けることはできますか? EJBコンテナはプロバイダ・インタフェースに実装としてProviderBeanがあることを知ってはいけません。なぜなら、これは暗黙的に、他のいくつかのBeanがそうするようにAbstractProviderを拡張することによって暗黙的に定義されているからです。@EJB Provider prv; ProviderBeanのインスタンスを挿入します。もちろん、ここには問題があります。これはProviderであるため、コンテナはExtProviderBeanのインスタンスを挿入できます。しかし、ローカルインターフェイスを明示的に実装するようにクラスを宣言することなくこれを解決する他の方法はありますか? – Elvis

+0

私はJEE 6の専門家はいませんが、JEE 5(したがってEJB 3.0)の依存性注入は、同じEJBインターフェイスの複数の実装を拒否します(少なくとも私の経験です)。より多くの情報を提供することで(例えば 'beanName'属性を使用して)行うことができますが、明示的なインターフェースを使用することをお勧めします。 Btw、 'それは動作しません'かなり曖昧です、あなたはより多くの情報を与えることができますか? – Thomas

答えて

0

私はちょうどthis SO questionを通して読んで、私は答えがあなたのケースにも当てはまると思います。私は答え、それによってEE仕様の一部を引用しています

:fooとbarを想定すると、

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

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

は、ローカルビジネスインタフェースであり、何の 関連するデプロイメントディスクリプタ、セッションBean Aが公開されていませんローカル ビジネスインタフェースFooおよびセッションBean Bは、ローカルビジネス インタフェースバーを公開しますが、Fooは公開しません。セッションBean Bは、明示的に のFooを、そのインターフェイスが適用される公開されたビューのセットに含める必要があります。

関連する問題