spring aop之@AfterReturning不生效問題及解決
spring aop之@AfterReturning不生效
長話短說,我其他的都已經檢查過了,連@Before都能成功執(zhí)行,@AfterReturning就是不執(zhí)行。
后經檢查,是我@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()切入點表達式的方法,經檢查,是可以確定到具體的攔截方法的。
按道理,這樣是沒問題的,我反復的檢查,也百度了半天,始終沒解決問題,在這兒搗鼓了半天,最終讓我發(fā)現了問題,就是這個Result出了問題
確實,我們接口返回的都是響應體都是Result的json格式, 但是呢,并不一定Controller的返回值就是Result,而是項目中通過org.springframework.web.method.support.HandlerMethodReturnValueHandler來包裝了返回體的,當然如果controller返回值本身就是Result,就不用再包裝。
我一直習慣了在controller返回業(yè)務的具體返回值而不是經過包裝的Result,所以忘了這茬。
Aop的執(zhí)行,是先于org.springframework.web.method.support.HandlerMethodReturnValueHandler的,所以在正常返回通知中,根據returning指定的是Result,而controller本身返回又是List、String等業(yè)務返回值,兩者匹配不上,就一直不生效。
總之:
正常反正通知中配置的 目標方法返回值 與 真實的目標方法返回值 無法匹配(相同或多態(tài)),導致正常返回通知無法執(zhí)行。
AOP @AfterReturning的使用
1.首先引入依賴
<!--spring AOP的支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
2.定義一個注解作為切點
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LogInfo { String value() default ""; }
3.寫aop實現
@Aspect @Component @Slf4j public class LogInfoAspect { /** * 配置切點 切點為注解 意為有該注解的地方日志生效 */ @Pointcut("@annotation(com.example.myproject.annoation.LogInfo)") public void pointcut() { } /** * 定義切點,返回值為user,要與下面方法中的入參名user保持一致 * returning的是獲取到要提取日志的方法的返回值 */ @AfterReturning(pointcut = "pointcut()",returning = "user") public void afterReturning(Object user){ User user1 = (User) user; log.info("用戶Id為:" + user1.getUserId()); log.info("用戶名稱為:" + user1.getUserName()); } }
4.寫測試接口
/** * aop測試 * 這里的user類和aop實現類中定義的returning值 User 保持一致,這樣aop中才能正確讀取到返回值 * @param * @return */ @LogInfo @PostMapping("/aopTest") public String aopTest(@RequestBody User user){ return user.getUserName(); }
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Spring Bean Scope 有狀態(tài)的Bean與無狀態(tài)的Bean
這篇文章主要介紹了Spring Bean Scope 有狀態(tài)的Bean與無狀態(tài)的Bean,每個用戶有自己特有的一個實例,在用戶的生存期內,bean保持了用戶的信息,下面來了解有狀態(tài)和無狀態(tài)的區(qū)別吧2022-01-01SpringBoot集成SpringSecurity安全框架方式
這篇文章主要介紹了SpringBoot集成SpringSecurity安全框架方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05java、php、C#、asp實現短信群發(fā)功能的方法
這篇文章主要介紹了java、php、C#、asp實現短信群發(fā)功能的方法,以實例形式較為詳細的分析了java及php、C#、asp、VB.NET等調用短信發(fā)送接口進行短信發(fā)送的功能,需要的朋友可以參考下2015-02-02