2012-05-02 19 views
7

私が取り組んでいるJava EE 6プロジェクトでは、注入されていない@EJBで注釈された孤独なフィールドがあります。注射は他のどこでもうまくいきます。Java EE 6抽象クラスへの注入

Java EEの新機能であるため、抽象クラスに属するフィールドに関連するかどうかわからないし、Glassfish(3.1.2)の出力がなぜこの注入が起こっていないのかを見つけることはできません。

dataSourceControlフィールドがnullであるためにNullPointerExceptionが発生するまで、サーバーログにエラーまたは警告はありません。私は、DataSourceControlシングルトンがそのコンストラクタにロギングを入れてインスタンス化されていることを確認しました。

私が言うことができる限り、dataSourceControlフィールドは注入されていませんが、ログはこれが理由ではありません。

抽象クラスで定義されている注入に関して私が欠落しているルールはありますか?

「noob」と叫ぶものは何ですか?

明らかなエラーがない場合、これをデバッグする方法はありますか?

+0

これは、 'new CountryMap'ではなく、コンテナ(すなわち注入または参照)から' CountryMap'のインスタンスを取得する場合に有効です。 'CountryMap'のインスタンスをどうやって取得していますか? –

+0

bkail、あなたはそれを解決しました!私は他の方向に自分のコードを辿り、私のCountryMap(および他のMap)クラスは手動でインスタンス化されていました。 –

+0

@bkailあなたはあなたの答えを投稿してください。私はそれを正しいものとしてマークすることができますか?ありがとう。 –

答えて

11

注入は、どのクラス(基本クラス、スーパークラス、抽象スーパークラスなど)でも機能します。ただし、注入は、new CountryMapではなく、コンテナからのCountryMapのインスタンス(つまり、注入または参照)を取得する限り、動作します。 CountryMapのインスタンスはどうやって取得していますか?

+0

要約:抽象クラスで定義されたインジェクションが可能です。インスタンスをコンテナ管理していないため、手動でBeanをインスタンス化しないでください。注入は行われません。 –

0

注射は他の場所では問題ありません。

コンテナがマネージクラスのインジェクションを担当するため、@EJBアノテーションは抽象クラスでは機能しません。 JNDIを通じてEJBを手動で検索する必要があります。

+1

これはやや誤解を招くことです。アノテーションはどのクラス(基本クラス、スーパークラス、抽象スーパークラスなど)でも機能するはずですが、インスタンスがコンテナから取得された場合にのみ機能します。 –

+1

これは私が最初に思ったことであり、他は同じことを提案していますが、継承がアノテーションを具体的なクラスにもたらすので、これは重要ではないことがわかっている限りです。 bkailのおかげで、抽象クラスに注入することができますが、手動でCountryMapクラスをインスタンス化することで注入が中断されたことがわかりました。 –

+0

@bkailご理解いただきありがとうございます。 –