2016-10-11 2 views
0

Сегодня я пытаюсь управлять некоторыми файлами AOP с помощью Spring 4, и у меня проблема с @Around аннотацией. Он работает только после pointcut и ведет себя как @ После аннотации. Что еще хуже - комбинация @Before и @Around эффекты аннотации только при вызове метода после pointcut.AOP, Spring 4 MVC и @Around аннотация

Комбинация @After и @Before работает нормально. Честно говоря, я понятия не имею, почему это так.

Я также пытаюсь использовать mockito для обнаружения вызова метода АОП, но он не работает.

У меня есть класс конфигурации

@Configuration 
@EnableAspectJAutoProxy 
@ComponentScan(basePackages = { "my.package.to.aop" }) 
public class AOPConfiguration {} 

АОП класс:

@Aspect 
@Component 
public class SmartLoggerAspect { 

    @After("execution(* my.package.to.specific.function." 
      + "repositories.PagingAndSortingBookRepository.findAll(" 
      + "org.springframework.data.domain.Pageable) )") 
    public void afterPage(JoinPoint joinPoint){ 
     System.out.println("\n\n\n\nCALLED AFTER: " + joinPoint.getSignature().getName()); 
    } 

    @Before("execution(* my.package.to.specific.function." 
      + "repositories.PagingAndSortingBookRepository.findAll(" 
      + "org.springframework.data.domain.Pageable) )") 
    public void beforePage(JoinPoint joinPoint){ 
     System.out.println("\n\n\n\nCALLED BEFORE: " + joinPoint.getSignature().getName()); 
    } 

    @Around("execution(* my.package.to.specific.function." 
      + "repositories.PagingAndSortingBookRepository.findAll(" 
      + "org.springframework.data.domain.Pageable) )") 
    public void aroundPage(JoinPoint joinPoint){ 
     System.out.println("\n\n\n\nCALLED AROUND: " + joinPoint.getSignature().getName()); 
    } 
} 

И я сделал UnitTest для него

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(classes = { JPAConfig.class, AOPConfiguration.class }) 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, TransactionalTestExecutionListener.class }) 
public class AspectTest { 

    @Autowired 
    PagingAndSortingBookRepository pagingAndSortingRepo; 
    @Autowired 
    SmartLoggerAspect smartLoggerAspect; 

    JoinPoint joinPoint; 


    @Test 
    public void pagingTest(){ 
     pagingAndSortingRepo.findAll(new PageRequest(1, 1)); 
     //verify(smartLoggerAspect, times(1)).afterPage(joinPoint); 
    } 
} 
+0

Для чего вам нужны '@ Before' +' @ After' __and__ '@ Around' советы? Почему бы вам не попробовать расчесывать советы в одном совете '@ Around'? –

+0

Потому что я новичок и много способов использовать АОП. Когда я комментирую функцию aBefore и aAfter и оставляю aAround только, все равно у меня такая же проблема. –

+0

Что вы имеете в виду под «Это работает только после pointcut [...]»? –

ответ

0

Я думаю, что проблема использования JoinPoint вместо ProceedindJoinPoint для метод консультаций around.

Также вам необходимо вызвать метод pjp.proceed в совете вокруг.

Цитируя spring docs

Первый параметр метода консультации должны быть типа ProceedingJoinPoint. В рамках совета, вызов continue() в ProceedingJoinPoint вызывает выполнение базового метода.

+0

Нет я отредактирован эту функцию @Around ("исполнение (* my.package.to.specific.function." \t \t \t + "repositories.PagingAndSortingBookRepository.findAll (" \t \t \t + «org.springframework.data .domain.Pageable)) ") \t public void aroundPage (ProceedingJoinPoint continueingJoinPoint) throws Throwable { \t \t ПродолжитьJoinPoint.proceed(); \t \t \t \t System.out.println ("\ n \ n \ n \ nCALLED AROUND:" + continueJoinPoint.getSignature(). GetName()); \t} И по-прежнему имеет ту же проблему –

Смежные вопросы