でドキュメントを保存する際に、Spring の側面を使用して追加のデータを保存しようとしていますMongoRepository
。ターゲットは次のインターフェイスです。
@InSearch
public interface ItemRepository extends MongoRepository<Item, Long>,
ItemRepositoryCustom
{
List<Item> findAllByUsername( String username );
List<Item> findAllBySessionId( Long sessionId );
}
このポイントカットを使用すると:
@Pointcut( "execution(* save(..)) && " +
"target(org.springframework.data.mongodb.repository.MongoRepository)" )
private void saveEntity()
{}
このメソッドは、open
メソッドが呼び出される前に正常に実行されます。
@Before( "saveEntity() && args(entity)" )
public void beforeSavingEntity( JoinPoint jp, AuditedBean entity )
{ ... }
しかし、注釈が付けられたインターフェースでのみ実行したい@InSearch
ので、そのようにポイントカットを定義しようとしました:
@Pointcut( "execution(* save(..)) && " +
"target(org.springframework.data.mongodb.repository.MongoRepository) && " +
"@target(xx.annotations.InSearch)" )
private void saveEntity()
{}
注釈の定義:
@Target( { ElementType.TYPE} )
@Retention(RetentionPolicy.RUNTIME)
public @interface InSearch
{}
このポイントカットでは、メソッドbeforeSavingEntity
は呼び出されません。ログにエラーはありません。@target
についてのドキュメンテーションと との違いを理解できたかどうかはわかりません@within
。私も試してみましたが@within
、どちらもうまくいきませんでした。
拡張し、注釈が付けられsave
たインターフェイスを実装するクラスでメソッドの実行を選択するには、このポイントカットをどのように定義する必要がありますか?MongoRepository
@InSearch
ありがとうございました!