は、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がインタフェースを実装することを明示的に定義する必要があることです。私は何かを逃しているのですか、これは限界ですか?
私はEJB 3.1についてはわかりませんが、コンテナは実際のEJBクラスに対してのみ暗黙的なローカルインタフェースを作成するか、直接実装されたインタフェースを使用すると思います - 特に 'AbstractProvider'は注釈されませんクラスレベル)、EJBと認識される可能性があります。 – Thomas
私には2つの質問があります:抽象クラスに注釈を付けることはできますか? EJBコンテナはプロバイダ・インタフェースに実装としてProviderBeanがあることを知ってはいけません。なぜなら、これは暗黙的に、他のいくつかのBeanがそうするようにAbstractProviderを拡張することによって暗黙的に定義されているからです。@EJB Provider prv; ProviderBeanのインスタンスを挿入します。もちろん、ここには問題があります。これはProviderであるため、コンテナはExtProviderBeanのインスタンスを挿入できます。しかし、ローカルインターフェイスを明示的に実装するようにクラスを宣言することなくこれを解決する他の方法はありますか? – Elvis
私はJEE 6の専門家はいませんが、JEE 5(したがってEJB 3.0)の依存性注入は、同じEJBインターフェイスの複数の実装を拒否します(少なくとも私の経験です)。より多くの情報を提供することで(例えば 'beanName'属性を使用して)行うことができますが、明示的なインターフェースを使用することをお勧めします。 Btw、 'それは動作しません'かなり曖昧です、あなたはより多くの情報を与えることができますか? – Thomas