Spring AOP pointcut с «@target» не работает, потому что не может получить доступ к текущему вызову - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь заставить работать pointcut.

Этот pointcut работает:

@Around("execution(public * my.package..*ClassSuffix.*(..))")

Но этот pointcut не работает:

@Around("execution(public * my.package..*ClassSuffix.*(..)) && !@target(my.package.NoLogging)")

Исключение составляет

DEBUG o.s.aop.aspectj.AspectJExpressionPointcut - Could not access current invocation - matching with limited context: java.lang.IllegalStateException: No MethodInvocation found: Check that an AOP invocation is in progress, and that the ExposeInvocationInterceptor is upfront in the interceptor chain. Specifically, note that advices with order HIGHEST_PRECEDENCE will execute before ExposeInvocationInterceptor!
DEBUG o.s.aop.aspectj.AspectJExpressionPointcut - Failed to evaluate join point for arguments [] - falling back to non-match
java.lang.NullPointerException: null
        at org.aspectj.weaver.reflect.ShadowMatchImpl$RuntimeTestEvaluator.visit(ShadowMatchImpl.java:195)
        at org.aspectj.weaver.ast.HasAnnotation.accept(HasAnnotation.java:31)
        at org.aspectj.weaver.reflect.ShadowMatchImpl$RuntimeTestEvaluator.matches(ShadowMatchImpl.java:132)
        at org.aspectj.weaver.reflect.ShadowMatchImpl$RuntimeTestEvaluator.visit(ShadowMatchImpl.java:163)
        at org.aspectj.weaver.ast.Not.accept(Not.java:26)
        at org.aspectj.weaver.reflect.ShadowMatchImpl$RuntimeTestEvaluator.matches(ShadowMatchImpl.java:132)
        at org.aspectj.weaver.reflect.ShadowMatchImpl.matchesJoinPoint(ShadowMatchImpl.java:87)
        at org.springframework.aop.aspectj.AspectJExpressionPointcut.matches(AspectJExpressionPointcut.java:357)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:174)
        at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688)
        at my.package.FooClassSuffix$$EnhancerBySpringCGLIB$$e7bc07ac.doSomething(<generated>)

Так что, кажется, что более сложный pointcut требует некоторого контекста, и ExposeInvocationInterceptor#invoke(..) вызывается в некоторой точке, но не в нужной точке, потому что ExposeInvocationInterceptor#currentInvocation() вызывает исключение?

Что-то не так с pointcut?Я использовал это как ссылку: https://stackoverflow.com/a/38866088/361414

Точечные точки определены в классе с такими аннотациями:

@Aspect
@Component
@Order(20)
...