亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Spring AOP 時,在單個連接點上綁定參數的多個環繞通知會導致錯誤

使用 Spring AOP 時,在單個連接點上綁定參數的多個環繞通知會導致錯誤

斯蒂芬大帝 2021-12-01 16:32:58
我在一個方法上寫了 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,問題仍然存在。恕我直言,上面的代碼應該可以工作,我自己也沒有發現任何錯誤。我不確定這是一個錯誤還是其他我不知道的東西。任何幫助將不勝感激。謝謝你。
查看完整描述

3 回答

?
四季花海

TA貢獻1811條經驗 獲得超5個贊

問題已解決,但仍有問題。

我正在使用 2 個方面類,其順序設置為Ordered.HIGHEST_PRECEDENCEOrdered.LOWEST_PRECEDENCE。如果我Ordered.HIGHEST_PRECEDENCE用另一個值替換訂單值,錯誤就會消失。相當奇怪的現象,異常顯示與實際原因無關。有誰知道真正的原因?


查看完整回答
反對 回復 2021-12-01
?
qq_遁去的一_1

TA貢獻1725條經驗 獲得超8個贊

這是因為ExposeInvocationInterceptor沒有先加載,導致userAttributes不會被Spring Bean (for 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. 改變OrderedHIGHEST_PRECEDENCE,也許HIGHEST_PRECEDENCE+1

  2. 手動注入 bean ApplicationContext.getBean


查看完整回答
反對 回復 2021-12-01
?
阿晨1998

TA貢獻2037條經驗 獲得超6個贊

我發現了另一種情況,可能會使 中的調用無效Exposeinvocationinterceptor,導致org.springframework.aop.aspectj.aspectjexpressionpointcut ? matches (java.lang.reflect.method, java.lang.class <? >, Java. Lang.Object...)無法獲得有效的方法調用。

具體情況:當有多個aspect時,當一個高優先級aspect異步處理時joinpoint.Processed(),下一個aspect會切換到一個新的線程,所以無法獲取到ThreadLocal變量。

http://img1.sycdn.imooc.com//61a7336b0001459510410870.jpg

查看完整回答
反對 回復 2021-12-01
  • 3 回答
  • 0 關注
  • 642 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號