2017-02-25 17 views
2

私はSpringブートを使用してREST APIを設定しています。私は@RestControllerの束を作り、Modelと呼ぶ特定の抽象クラスのサブタイプを返すメソッドにポイントカットを設定したいと思う。ポイントカットの戻り値の型としてジェネリック型を使用する

public class Person extends Model { 
    ... 
} 

だから、次のようになりますアドバイスを記述することが可能であろう:

@Aspect 
@Component 
public class ModelAspect { 
    @AfterReturning(
     value = "execution(<T extends mypackages.Model> T mypackages.api.*.*(..))", 
     returning = "model") 
    public void doSomethingWithModel(Model model) { 
     ... 
    } 
} 
Personクラスは次のようになります

@RestController 
public class UserController { 
    @RequestMapping(...) 
    public Person getAllPeople() { 
     ... 
    } 
} 

:これらのコントローラは、このような何かを見て

もちろん、アドバイスは構文的には有効ではないため、動作しません。参照ドキュメントでは、返される型(Spring AOP reference)ではなく、汎用パラメータに関する情報しか見つかりませんでした。私が今持っていることは、このですが、私は上記の例のようなものが多く、より効率的になると思います。

@Aspect 
@Component 
public class ModelAspect { 
    @AfterReturning(
     value = "execution(* mypackages.api.*.*(..))", 
     returning = "model") 
    public void doSomething(Object model) { 
     if (model instanceof Model) 
      doSomethingWithModel((Model) model); 
    } 
} 

私の次の質問は以下のようになり、ModelのsuptypesのCollectionを返すこれらのメソッドのための可能な同じです?リファレンスでは、パラメータタイプは汎用のCollectionであることはできないためです。

答えて

2

インターフェイスの後ろに+を使用してみましたか?

@Aspect 
@Component 
public class ModelAspect { 
    @AfterReturning(
     value = "execution(mypackages.Model+ mypackages.api.*.*(..))", 
     returning = "model") 
    public void doSomethingWithModel(Model model) { 
     ... 
    } 
} 

戻り値の型を指定しないでください。戻り句はまただけ方法にこの内の指定されたタイプ(オブジェクトの値を返す 実行を一致制限

:戻り句で使用されるパラメータの種類によって解決される文書に基づきます の場合、戻り値に一致します)。

@Aspect 
@Component 
public class ModelAspect { 
    @AfterReturning(
     value = "execution(* mypackages.api.*.*(..))", 
     returning = "model") 
    public void doSomethingWithModel(Model model) { 
     ... 
    } 
} 

下記のリンクに見てください。それは、ジェネリックコレクションについての2番目の質問にも答えます。

Aspectj Matching Return Type


ただ、好奇心のために、私はこれをテストするためのプロジェクトを作成して、それがまっすぐに私のために仕事を始めました。あなたのポイントカットが指しているパスが間違っているとしか思えません。試してみてください:

@Aspect 
@Component 
public class ModelAspect { 
    @AfterReturning(
     value = "execution(* mypackages.api..*(..))", 
     returning = "model") 
    public void doSomethingWithModel(Model model) { 
     ... 
    } 
} 

あなたはで私のプロジェクトに見ていることができます:あなたはポイントカットのために異なる値(一つだけもちろん、コメントしていない)、有効なそれらのすべてを見ることができますがありspring-aspectj-interfaces

+0

運がありません。私はクラス宣言とメソッドのパラメータで使われている "+"について読んでいましたが、戻り値の型ではなく、おそらくそれがまだサポートされていませんでしたか?私は 'Model'は実際にはインターフェースではなく抽象クラスであることに注意してください。私はそれを私の質問でも変更します。 – delucasvb

+1

@delucasvb、私は私の答えを編集しました。 – alfcope

+0

それでも動作させることができません...私は 'value'パラメータと' pointcut'パラメータの両方を試しました。エラーはなく、アスペクトのメソッドは呼び出されません。「実行」アドバイスbtwを使用するときは、戻り値の型を指定する必要がありますが、ワイルドカード '*'でもかまいません。 – delucasvb

関連する問題