2012-11-16 5 views
1

나는 MongoRepository과 함께 문서를 저장하는 동안 데이터를 저장하기 위해 Spring aspect를 사용하려고한다.@target이있는 정의 된 pointcut이 작동하지 않는 이유는 무엇입니까?

@Before("saveEntity() && args(entity)") 
public void beforeSavingEntity(JoinPoint jp, AuditedBean entity) 
{ ... } 

하지만 그것은 단지 실행하려면 :

@Pointcut("execution(* save(..)) && " + 
    "target(org.springframework.data.mongodb.repository.MongoRepository)") 
private void saveEntity() 
{} 

이 방법은 open 메서드를 호출하기 전에 확인을 실행 :이 포인트 컷을 사용하면

@InSearch 
public interface ItemRepository extends MongoRepository<Item, Long>, 
    ItemRepositoryCustom 
{ 
    List<Item> findAllByUsername(String username); 
    List<Item> findAllBySessionId(Long sessionId); 
} 

: 대상이 인터페이스

: @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도 시도해 보았지만 작동하지 않았다.

어떻게 MongoRepository를 확장하고 @InSearch와 주석이 인터페이스를 구현하는 클래스에 save 방법의 실행을 선택하려면이 포인트 컷을 정의해야합니다?

감사합니다.

+0

개인 액세스 수정 자에 대한 확신이 있으십니까? 나는 정확하게 기억하지 못한다 :) 또한 런타임에'@ InSearch'가 유지됩니까? –

+0

예, 확실합니다. 첫번째 것은 그것으로 작동합니다. 인터페이스 정의에 기반을 둔 - "MongoDB를 봄 문서" – francadaval

+0

예에 의해'InSearh' 정의 – francadaval

답변

1

나는 당신이 당신의 응용 프로그램에서 클래스 기반의 프록시를 사용하고 있다고 생각합니다.

주석이 자바에서 구현하는 클래스에 의해 상속되지 않는 것처럼, 구현 클래스에 @InSearch를 넣어보십시오.

Where should I put @Transactional annotation: at an interface definition or at an implementing class?

+0

앞서 말했듯이, 구현 클래스는 인터페이스 정의에 기반한 "Spring Document - MongoDB"에 의해 작성되었습니다. 주석 달기는 옵션이 아닙니다. – francadaval