2017-11-21 11 views
0

私はAOPを初めて使用しており、現在カスタム注釈で注釈が付けられたコントローラメソッドのアスペクトを実装しようとしています。 myFunctionが呼び出されたとき、に私はいつもNullPointerExceptionを取得します。それはコントローラの2つのインスタンスがあるようです。それらのうちの1つは、リポジトリのオートワイヤリングなしでインスタンス化されます。 @MyAnnotationを削除すると、すべてが期待通りに機能します。アスペクト使用時にSpring Boot RestControllerのコンストラクタが呼び出されない

Spring/AspectJにコンストラクタを強制的に使用させる方法についてのヒントはありますか?

私のコントローラは次のようになります。側面

@RestController 
@RequestMapping(value = "/api") 
public class MyController { 
    private Repository repository; 

    public MyController(Repository repository) { 
     this.repository = repository; 
    } 

    @RequestMapping(value = "/{variable1}", method = GET) 
    @MyAnnotation 
    public final FeatureCollection myFunction(
     final @PathVariable(required = true) long variable1 
    ) { 
     repository.findById(variable1); 
     (...) 
    } 
} 

@Aspect 
public class MyAspect { 
    @Around("@annotation(MyAnnotation)") 
    public Object any(ProceedingJoinPoint pjp) throws Throwable { 
     return pjp.proceed(); 
    } 
} 

設定:

@Configuration 
@EnableAspectJAutoProxy 
public class WebConfig { 
    @Bean 
    public MyAspect myAspect() { 
     return new MyAspect(); 
    } 
} 
+0

あなたのSpringバージョンは何ですか? – sjahan

+0

_Spring Boot Starter Parent_バージョンは1.5.6です。リリース – anste

+0

だから、答えには、「@ Autowired」は必要ありません。私は自分自身でそれをテストするつもりです、私はかなりコントローラが代理されている方法によると確信しています。私は再現しようとしていると私はあなたに戻ってきます。 – sjahan

答えて

0

注釈付きメソッドがfinalであることが原因です。

キーワードfinalを削除することができます。

"spring aop final methods"のようなgoogleの場合は、もっと詳しく知ることができますが、基本的には、Springがプロキシを作成するときに元のクラスのサブクラスを生成し、 。問題は、最後のメソッドをサブクラスで継承できないため、プロキシが機能しなくなることです。したがって、多くの制限がそこから生まれ、AOPはfinalのものでそれほど動かない。

final方法がすることはできません...

11.6プロキシメカニズム

この制限は、ドキュメントに記載されている、私はあなたがそれのための回避策を得るだろうとは思いません彼らは上書きすることができないので、アドバイスされます。

これがお手伝いします。

+0

ありがとう!私は私の間違いを見つけるのに数時間を費やしました。 – anste

0

が@Autowired

@Autowired 
public MyController(Repository repository) { 
    this.repository = repository; 
} 
と注釈コンストラクタに試してみてください
+0

コンストラクタパラメータの前に@Qualifier注釈が必要だと思います。 – duffymo

+0

コンストラクタに@Autowiredを注釈付けしようとしました。しかし、私はまだNPEを取得しています。 – anste

関連する問題