欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

spring aop之@AfterReturning不生效問題及解決

 更新時間:2024年05月10日 10:38:09   作者:阿亮_1024  
這篇文章主要介紹了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();
    }

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

最新評論