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