2017-01-29 21 views
0

私は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のポイントカットを設定する可能性がある場合はこのように、私の質問は、あります。

事前にすべての回答に感謝します。

+0

これは、AspectJの代わりにSpring AOPを使用する方が良いと考えることができる唯一の使用例です。 Spring AOPは、Spring独自のプロキシインフラストラクチャにうまく収まるはずです。 –

答えて

1

まあ、私は別の方法で私の問題を解決しました。

場合によっては、予想よりも複雑ではありません。エンティティが変更されたときに、いくつかの機能を実行するためにSpring CRUDリポジトリにAspectJのポイントカットを追加するのは、ベスト・アイデアではありませんでした。

私の要件を実装する方法がはるかに簡単です:javax.persistenceパッケージには、このジョブに完全に対応する注釈@EntityListenersが用意されています。だから、リスナーとのエンティティクラスに注釈を付けるとリスナークラス内の必要な機能を実装:EntityListener

@Entity 
@EntityListeners(CustomerEntityListener.class) 
//@Table, @NamedQueries and other stuff ... 
public class Customer implements Serializable { 
    ... 
} 

実装:

public class CustomerEntityListener { 
    @PostPersist 
    public void customerPostPersist(Customer customer) { 
     //Add functionalities 
    } 
} 

EntityListenerもそうで、@PostUpdateのための注釈を提供し@PostRemoveと - visit this site for more information