2016-05-18 10 views
0

Javaプログラムで@Aspectアノテーションを使用するAspectJクラスを使用していますが、インタフェースクラスに@Injectを使用してインジェクトするクラスコンストラクタを作成したいと思います。このよう次のようにNoAspectBoundExceptionのエラー:Dependency Injectionを使用したAspectJクラスのクラスコンストラクタでエラーが発生しました

de.hpi.cloudraid.exception.InternalClientError: org.aspectj.lang.NoAspectBoundException: Exception while initializing de.hpi.cloudraid.service.MeasurementAspect: java.lang.NoSuchMethodError: de.hpi.cloudraid.service.MeasurementAspect: method <init>()V not found 

はここに私のクラスの抜粋です:

@Aspect 
public class MeasurementAspect { 

    private final RemoteStatisticService remoteStatisticService; 

    @Inject 
    public MeasurementAspect(RemoteStatisticService remoteStatisticService) { 
     this.remoteStatisticService = remoteStatisticService; 
    } 
.... 
} 

私はプライベート@Inject RemoteStatisticService remoteStatisticServiceのような通常の噴射を使用しようとしました。しかし、それは私にNullPointerExceptionのエラーを与えました。

何か助けていただければ幸いです。ありがとう

+0

このアスペクトには、引数なしのコンストラクタが必要です。依存関係注入は側面では機能しません。アプリの起動時に手動で注入する必要があります。同様の質問について私の[回答](http://stackoverflow.com/a/36049252/2699901)を参照してください。それは受け入れられた答えではありませんが、私はinter-type宣言を使用し、アドバイスされたbeanも管理しなければならないという受け入れられた答えよりも単純だと考えています。 –

+0

@NándorElődFeketeGreeterAspect.aspectOf()のこのケースでは、提案をありがとう。setGreeter(greeter);私の場合に実装するには、私はインターフェイスクラスを注入していると同様のソリューションを考えることができなかったと私はそれがインターフェイスクラスのゲッターとセッターを作ることは不可能だと思う。 AspectJ実装のアスペクトクラスの代わりに注釈を使用しているため、メソッドaspectOf()もパッケージには存在しません。 CMIIW –

+0

@NándorElődFekete私は実際には、アスペクトにインターフェイスを注入するのではなく、このクラスにインターフェイスを注入しますが、NullPointerExceptionエラーが発生するという「第三者」クラスの使用を考えました。たぶんあなたはそれを見て助けることができる[ここ](http://stackoverflow.com/questions/37319528/injection-error-nullpointerexception-for-aspectj-annotation-class-java)ありがとう –

答えて

0

アスペクトは依存性注入の候補ではないので、この制限を回避する必要があります。また、CDIではなくaspectjランタイムによってインスタンス化されており、インスタンス化を制御することはできません。

できることは、CDIコンテナによって処理される別のクラスを作成し、代わりにこのヘルパークラスにアスペクトの依存関係を注入することです。次に、このヘルパークラスからアスペクトの依存関係を手動で設定します。このヘルパークラスをスタートアップシングルトンとしてマークすると、依存関係が満たされた後に起動時に実行されます。あなたはこの1つに似て起動シングルトンヘルパーBeanに使用することができ

:もちろん

@Singleton 
@Startup 
public class MeasurementAspectSetup { 

    @Inject 
    private RemoteStatisticService remoteStatisticService; 

    @PostConstruct 
    private void setupAspect() { 
     Aspects.aspectOf(MeasurementAspect.class). 
      setRemoteStatisticService(this.remoteStatisticService); 
    } 

} 

を、あなたは、側面にRemoteStatisticService用セッターを追加する必要があり、または局面では、フィールドの可視性を変更するだろうし、直接設定してください。また、デフォルトの引数なしコンストラクタが利用できるように、アスペクトからパラメトリックコンストラクタを削除する必要があります。

+0

この場合、RemoteStatisticServiceインターフェイスをMeasurementAspectクラスに注入または開始する必要がありますか? –

+0

私の答えを編集し、そこに詳細を提供しましょう。 –

+0

私はあなたのコードをMeasurementAspectにインターフェイスRemoteStatisticServiceを注入して試しましたが、まだNullPointerExceptionエラーです。 [Here](http://pastebin.com/UMWgDvgg)はMeasurementAspectクラスのコードです(長すぎるため抜粋のみ) –

関連する問題