2017-09-05 13 views
1

問題: 他の2つのクラス(サーブレット)で注入した2つのサブクラスを持つBean(フィルタ内)を注入すると、予期しない動作が発生しました。注入されたスーパークラスは、実行時にサブクラスインスタンスへの参照を保持できるようになりました(各コンテナが再起動されると変更されます)。注入されたスーパークラスBeanは、間違ったインスタンス(サブクラスBeanインスタンス)をどのように注入できますか?

私は重大な間違いをしているに違いないが、正確には何かを理解することはできない。

追加情報:私はサブクラスの1以上にランダムなインスタンスを保持しているスーパークラスを注入フィルタで

私は、Java EE6

クラス構造を使用しますスーパークラス:

@EJB 
private ClientLogger clientLogger; 

su私は私のサーブレットの一つに注入

@Stateless 
@LocalBean 
public class ClientLogger implements HcpEntityBeanLogger<Client> { 

private Client client; 

public ClientLogger(){ 
} 

.... 

} 

このサブクラス豆:

@Stateless 
@LocalBean 
public class AdminClientLogger extends ClientLogger { 

public AdminClientLogger(){ 
} 
... 
} 

ソリューションの試み:

だから、限り、私はそのサブクラスを理解するように、このようなクラスとなって開始あたり最後に注入されたものがclientLoggerによって参照されるインスタンスになりますが、なぜ、3つの異なるインスタンスを持ち、継承を使用できないのですか?

編集: すべて同じインターフェイスを実装する複数のクエリBeanを注入すると、この問題が再び発生しました。すべて同じインスタンスへの参照を保持します。

ソリューションは、あなたが@EJB注釈に検索属性を使用し、注入された必要なサブクラスを取得することができEJB

@EJB(beanName="name of your bean class or name specified in @Stateless(name="..")) 

答えて

0

これは基本的に、具体的なサブクラスへの参照を忘れると起こります。コンテナは明らかに、具体的なクラスの1つの同じインスタンスを注入するだけです。

具象クラス参照するいくつかの方法がある:

ルックアップ(@NiranjanBhatから例)

@EJB(lookup="java:global/rest/AdminClientLogger") 
    private ClientLogger clientLogger; 

のbeanNameも

    @EJB(beanName="name of your bean class or name specified in @Stateless(name="..")) 
    

    ある

  • 名前
  • beanInterface
  • にmappedName

    それらを使用するためにどのように取ることができfrom the java docs about EJB

1

とのインタフェースを注入するのbeanName wennを追加しました。例えば。

 @EJB(lookup="java:global/rest/AdminClientLogger") 
     private ClientLogger clientLogger; 

明らかに、上の例のJNDIルックアップパスを変更する必要があります。

関連する問題