我正在尝试使用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
方法执行?
谢谢!
答案 0 :(得分:1)
我认为您在应用程序中使用了基于类的代理。
由于Java中的实现类没有继承注释,请尝试将@InSearch
放在实现类上。