天天看點

spring aop之 @AfterReturning 不生效

長話短說,我其他的都已經檢查過了,連@Before都能成功執行,@AfterReturning就是不執行。

後經檢查,是我@AfterReturning中returning的問題,我設定的是:

@Pointcut("execution(public * com.xxx.xxx.xx.xxx.controller.*.*(..))")
    public void request() {}



 @AfterReturning(returning = "result", value = "request()")
 public void after(Result result){
	// 具體邏輯
 }
           

Result 是項目中公共的傳回對象,裡面包含 code、body等等,大同小異。

其中SaveToInsetSql()切入點表達式的方法,經檢查,是可以确定到具體的攔截方法的。

按道理,這樣是沒問題的,我反複的檢查,也百度了半天,始終沒解決問題,在這兒搗鼓了半天,最終讓我發現了問題,就是這個Result出了問題

确實,我們接口傳回的都是響應體都是Result的json格式, 但是呢,并不一定Controller的傳回值就是Result,而是項目中通過org.springframework.web.method.support.HandlerMethodReturnValueHandler來包裝了傳回體的,當然如果controller傳回值本身就是Result,就不用再包裝。我一直習慣了在controller傳回業務的具體傳回值而不是經過包裝的Result,是以忘了這茬。

Aop的執行,是先于org.springframework.web.method.support.HandlerMethodReturnValueHandler的,是以在正常傳回通知中,根據returning指定的是Result,而controller本身傳回又是List、String等業務傳回值,兩者比對不上,就一直不生效。

總結:正常反正通知中配置的 目标方法傳回值 與 真實的目标方法傳回值 無法比對(相同或多态),導緻正常傳回通知無法執行。