spring @AfterReturning返回值問題
spring @AfterReturning返回值
@AfterReturning是用于做aop的,其中返回值的問題,坑了我比較久,特地寫出來。
1. 正確的使用
@AfterReturning(value = "pointCut()", returning = "obj")
public Object doAfterReturning(JoinPoint joinPoint, Object obj) {
// 正常情況下,我們想要修改obj,只需要強轉(zhuǎn)為對應(yīng)的對象,再重新設(shè)置值即可,如下
User user = (User)obj;
user.setName("test");
return user;
}2. 錯誤的使用
@AfterReturning(value = "pointCut()", returning = "obj")
public Object doAfterReturning(JoinPoint joinPoint, Object obj) {
// 直接修改了obj的引用地址
User user = new User();
obj = user;
return obj;
}區(qū)別就是方式一并沒有更改obj的引用指針地址,返回結(jié)果是更新了name屬性后的用戶
而方式二更改了obj引用指針,返回結(jié)果并不是新new的user對象,而是入?yún)bj對象
所以使用時要注意:
AfterReturning方法雖然能修改返回值,但是局限于相同的對象地址,即最后返回對象的引用地址和入?yún)⒌囊玫刂繁仨毾嗤?/p>
所以能修改返回值的也只有引用類型,基本類型是不允許的
@AfterReturning方法執(zhí)行了,但是切入方法沒執(zhí)行
首先,在一個批量插入的方法定義了切入點
@Pointcut(value = "execution(* com.cases.dao.mapper.duty.DutyTableDao.insertBatch(..))")
public void pointcut() {
log.info("DutyDeleteInterceptor:pointcut");
}@AfterReturning方法可以正常進入,但是批量插入insertBatch方法卻沒有執(zhí)行。
原因就在@Around注解方法
這是原來的代碼
@Around(value = "pointcut()")
public void methodAround(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("DutyDeleteInterceptor:methodAround");
}修改后的代碼
@Around(value = "pointcut()")
public Object methodAround(ProceedingJoinPoint joinPoint) throws Throwable {
log.info("DutyDeleteInterceptor:methodAround");
return joinPoint.proceed();
}調(diào)試,成功。
小知識:
joinPoint.proceed() 的返回值是Object類型,Object result = joinPoint.proceed();
其實這句代碼的意思就是正常去執(zhí)行我們的業(yè)務(wù),返回值result,在錯誤代碼中,返回值寫成了void,所以正常業(yè)務(wù)拿不到返回值了
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決mybatisPlus 中的field-strategy配置失效問題
這篇文章主要介紹了解決mybatisPlus 中的field-strategy配置失效問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02
基于jenkins實現(xiàn)發(fā)布node.js項目
這篇文章主要介紹了基于jenkins實現(xiàn)發(fā)布node.js項目,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07
SpringBoot不讀取bootstrap.yml/properties文件問題
這篇文章主要介紹了SpringBoot不讀取bootstrap.yml/properties文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12
基于request.getAttribute與request.getParameter的區(qū)別詳解
本篇文章小編為大家介紹,基于request.getAttribute與request.getParameter的區(qū)別詳解。需要的朋友參考下2013-04-04
詳解Java中Array和ArrayList的比較和轉(zhuǎn)換
在 Java 編程中,arrays 和 arraylists 都是基本的數(shù)據(jù)結(jié)構(gòu),用來存放數(shù)據(jù)集合,雖然兩者的用途一樣,但是它們的特點極大地影響應(yīng)用的性能和靈活性,本文探討 arrays 和 arraylists 的重要特性,它們各自的強項和弱點,,需要的朋友可以參考下2023-08-08
一文吃透消息隊列RocketMQ實現(xiàn)消費冪等原理
這篇文章主要介紹了消息隊列RocketMQ實現(xiàn)消費冪等的全面講解,幫助大家吃透RocketMQ消息隊列消費冪等,更好的的應(yīng)用與工作實踐,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2024-01-01

