私はSpringのCrudRepository
を注釈@RepositoryRestResource
と組み合わせて使用して、RESTful APIを通して使用できるシンプルなCRUDアプリケーションを実装しています。私はAspectJのポイントカットを自分のリポジトリに追加して、インタフェースからのCRUDメソッドが呼び出されるたびにいくつかの機能が実行されるようにしたいと考えています。Spring CrudRepositoryのAspectJポイントカット
まず、私は、SpringのCrudRepository
私自身のインターフェースにいくつかのカスタム機能を追加するための拡張:
@RepositoryRestResource(collectionResourceRel = "customers", path = "customers")
public interface CustomerRestRepository extends CrudRepository<Customer, Integer>{
Customer findOneByGuid(@Param("customerGuid") String customerGuid);
//Other custom methods.
}
すべてが正常に動作していると私は私のRESTクライアントを経由してこのメソッドを呼び出すことができますよ。私はSpringが背後で奇跡として仕事をしているので、インターフェイスCustomerRestRepository
を実装する必要はありません。これは、スプリングのCrudRepository
を拡張することの重要な利点の1つです。
の問題は、私が今直面しています、このカスタムそれは実行だ後に、例えば、メソッドのすべての呼び出しを記録します方法findOneByGuid()
ににAspectJのポイントカットを追加にあります。
私はこれまでのところで試してみたことはある:
@Aspect
public aspect AfterCustomerCrudAspect {
@Pointcut(
"execution(* com.x.y.z.CustomerRestRepository.findOneByGuid(..))")
public void customerCrudMethod() {}
@AfterReturning("customerCrudMethod()")
public void doSomething() {
//Do something
}
}
私も試してみた:
1) execution(* com.x.y.z.CustomerRestRepository+.findOneByGuid(..))
2) execution(* org.springframework.data.repository.Repository+.*(..))
3) within(com.x.y.z.CustomerRestRepository)
4) annotation(RepositoryRestResource)
を...と私は覚えていない他の多くの。すべて同じ不満足な結果を伴います。アドバイスは決して適用されません。
ところで、私は例外を直面しません。私がexecution(* *.*(..))
を試してみると、アドバイスはうまくいきますが、もちろんfindOneByGuid()
に限定されません。したがって、私のコードは一般的に正しいと思います。
インターフェイス上にポイントカットを設定することはできません。しかし、自分でインターフェイスを実装する必要はないので、インターフェイスのメソッドにポイントカットを設定する方法を見つける必要があります。
さて、その1つの解決策は、インターフェイスCustomerRestRepository
を実装することです。しかし、私は自分自身でリポジトリのすべての実装作業を行い、SpringのCrudRepository
の利点を使用してスキップします。
春CrudRepository
のメソッドにAspectJのポイントカットを設定する可能性がある場合はこのように、私の質問は、あります。
事前にすべての回答に感謝します。
これは、AspectJの代わりにSpring AOPを使用する方が良いと考えることができる唯一の使用例です。 Spring AOPは、Spring独自のプロキシインフラストラクチャにうまく収まるはずです。 –