我在一个方法上写了 2 个注释和 2 个围绕建议来处理每个注释值。
连接点方法是这样的:
@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 类都实现了 Ordered 接口。当程序到达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 版本。
我当前的 Spring 框架和方面版本是 4.1.6。我尝试升级到 4.1.9 和 4.3.20,问题仍然存在。
恕我直言,上面的代码应该可以工作,我自己也没有发现任何错误。我不确定这是一个错误还是其他我不知道的东西。任何帮助将不胜感激。谢谢你。
四季花海
qq_遁去的一_1
阿晨1998
相关分类