Несколько советов Around с привязкой аргументов в одной точке соединения вызывают ошибку при использовании Spring AOP - PullRequest
0 голосов
/ 22 октября 2018

Я написал 2 аннотации для метода и 2 Around советы для обработки каждого значения аннотации.

Метод точки соединения выглядит так:

@CacheFetch(cacheName = CacheManager.CACHE_DATASOURCE_INFO)
@TenantAware(method = OperationMethod.OPERATION, operation = OperationType.GET)
public DataSourceInfo fetchDataSource(String sourceId) {...}

Совет 1 похож на это:

@Around("within(com.xx.yy.zz..*) && @annotation(fetch)")
public Object fetchFromCache(ProceedingJoinPoint pjp, CacheFetch fetch) throws Throwable {...}

Advice2, подобный этому:

@Around("isXXX() && @annotation(tenantAware)")
public Object handleTenantAware(ProceedingJoinPoint pjp, TenantAware tenantAware) throws Throwable {...}

Два совета находятся в разных классах Aspect и классах Aspect, оба реализовали упорядоченный интерфейс.Когда программа достигает метода точки соединения fetchDataSource, возникает исключение:

java.lang.IllegalStateException: Required to bind 2 arguments, but only bound 1 (JoinPointMatch was NOT bound in invocation)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.argBinding(AbstractAspectJAdvice.java:591)
    at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:616)
    at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:671)

Если я удаляю один из советов, ошибка исчезает, а остальные советы работают правильно.Я искал проблему, и большая часть результатов была из очень старых весенних версий.

Моя текущая версия Spring Framework и аспектов - 4.1.6.Я попытался обновить до 4.1.9 и 4.3.20, и проблема остается.

ИМХО приведенные выше коды должны работать, и я сам не нашел никаких ошибок.Я не уверен, что это ошибка или что-то еще, чего я не знаю.Любая помощь будет оценена.Спасибо.

Ответы [ 2 ]

0 голосов
/ 21 января 2019

Это вызвано тем, что ExposeInvocationInterceptor не загружается в первую очередь, и это приведет к тому, что userAttributes не будет вводить параметры при Spring Bean (для CacheFetch).

также вы можете найти комментарий в:

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!

, и есть также проблема , попробуйте исправить это с помощью PriorityOrdered, нокажется, что это все еще не происходит.

Так что для вашей проблемы есть два решения для решения этой проблемы:

  1. изменить Ordered не HIGHEST_PRECEDENCE, возможно HIGHEST_PRECEDENCE+1

  2. вводить вручную фасоль по ApplicationContext.getBean

0 голосов
/ 26 октября 2018

Проблема решена, но есть еще вопросы.

Я использовал 2 класса аспектов с порядком, установленным на Ordered.HIGHEST_PRECEDENCE и Ordered.LOWEST_PRECEDENCE.Если я заменю значение заказа Ordered.HIGHEST_PRECEDENCE другим значением, ошибка исчезнет.Довольно странное явление, и исключение не имело ничего общего с действительной причиной.Кто-нибудь знает настоящую причину?

...