1

でドキュメントを保存する際に、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

ありがとうございました!

4

1 に答える 1

1

アプリケーションでクラスベースのプロキシを使用していると思います。

アノテーションはJavaの実装クラスに継承されていないため、実装クラスを付け@InSearchてみてください。

@Transactionalアノテーションをどこに置くべきかを参照してください:インターフェース定義または実装クラスで?

于 2012-11-16T12:45:54.170 に答える