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 回答