解決Aop @AfterReturning因返回類型不一致導(dǎo)致無法執(zhí)行切面代碼
Aop @AfterReturning因返回類型不一致導(dǎo)致無法執(zhí)行切面代碼
要做返回異常之后,所有操作回滾的操作,本來想著泛型用 Object 就表示所有返回類型是 CommonResult 并且加指定注解的都走這個通知的代碼,但是如下配置,無論如何也不生效
進入源碼里發(fā)現(xiàn),判斷是否執(zhí)行這個 advice 會判斷被注解的方法的返回類型和通知方法的參數(shù)泛型是否一致
解決方法
就是把 afterReturning 通知的參數(shù)的泛型去掉。
AOP @AfterReturning的使用
首先引入依賴
<!--spring AOP的支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
定義一個注解作為切點
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LogInfo { String value() default ""; }
寫aop實現(xiàn)
@Aspect @Component @Slf4j public class LogInfoAspect { /** * 配置切點 切點為注解 意為有該注解的地方日志生效 */ @Pointcut("@annotation(com.example.myproject.annoation.LogInfo)") public void pointcut() { } /** * 定義切點,返回值為user,要與下面方法中的入?yún)⒚鹵ser保持一致 * returning的是獲取到要提取日志的方法的返回值 */ @AfterReturning(pointcut = "pointcut()",returning = "user") public void afterReturning(Object user){ User user1 = (User) user; log.info("用戶Id為:" + user1.getUserId()); log.info("用戶名稱為:" + user1.getUserName()); } }
寫測試接口
/** * aop測試 * 這里的user類和aop實現(xiàn)類中定義的returning值 User 保持一致,這樣aop中才能正確讀取到返回值 * @param * @return */ @LogInfo @PostMapping("/aopTest") public String aopTest(@RequestBody User user){ return user.getUserName(); }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
用java實現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-09-09springBoot 創(chuàng)建定時任務(wù)過程詳解
這篇文章主要介紹了springBoot 創(chuàng)建定時任務(wù)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-10-10Java Spring Boot實現(xiàn)簡易掃碼登錄詳解
這篇文章主要為大家詳細(xì)介紹了java Spring Boot實現(xiàn)app掃碼登錄功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2021-09-09Mybatis核心配置文件、默認(rèn)類型別名、Mybatis獲取參數(shù)值的兩種方式(實例代碼)
這篇文章主要介紹了Mybatis核心配置文件、默認(rèn)類型別名、Mybatis獲取參數(shù)值的兩種方式,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-03-03