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

spring aop之@AfterReturning不生效問(wèn)題及解決

 更新時(shí)間:2024年05月10日 10:38:09   作者:阿亮_1024  
這篇文章主要介紹了spring aop之@AfterReturning不生效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

spring aop之@AfterReturning不生效

長(zhǎng)話短說(shuō),我其他的都已經(jīng)檢查過(guò)了,連@Before都能成功執(zhí)行,@AfterReturning就是不執(zhí)行。

后經(jīng)檢查,是我@AfterReturning中returning的問(wèn)題,我設(shè)置的是:

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


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

Result 是項(xiàng)目中公共的返回對(duì)象,里面包含 code、body等等,大同小異。

其中SaveToInsetSql()切入點(diǎn)表達(dá)式的方法,經(jīng)檢查,是可以確定到具體的攔截方法的。

按道理,這樣是沒(méi)問(wèn)題的,我反復(fù)的檢查,也百度了半天,始終沒(méi)解決問(wèn)題,在這兒搗鼓了半天,最終讓我發(fā)現(xiàn)了問(wèn)題,就是這個(gè)Result出了問(wèn)題

確實(shí),我們接口返回的都是響應(yīng)體都是Result的json格式, 但是呢,并不一定Controller的返回值就是Result,而是項(xiàng)目中通過(guò)org.springframework.web.method.support.HandlerMethodReturnValueHandler來(lái)包裝了返回體的,當(dāng)然如果controller返回值本身就是Result,就不用再包裝。

我一直習(xí)慣了在controller返回業(yè)務(wù)的具體返回值而不是經(jīng)過(guò)包裝的Result,所以忘了這茬。

Aop的執(zhí)行,是先于org.springframework.web.method.support.HandlerMethodReturnValueHandler的,所以在正常返回通知中,根據(jù)returning指定的是Result,而controller本身返回又是List、String等業(yè)務(wù)返回值,兩者匹配不上,就一直不生效。

總之:

正常反正通知中配置的 目標(biāo)方法返回值 與 真實(shí)的目標(biāo)方法返回值 無(wú)法匹配(相同或多態(tài)),導(dǎo)致正常返回通知無(wú)法執(zhí)行。

AOP @AfterReturning的使用

1.首先引入依賴

      <!--spring AOP的支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2.定義一個(gè)注解作為切點(diǎn)

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LogInfo {
    String value() default "";
}

3.寫aop實(shí)現(xiàn)

@Aspect
@Component
@Slf4j
public class LogInfoAspect {
 
    /**
    * 配置切點(diǎn) 切點(diǎn)為注解 意為有該注解的地方日志生效
    */
    @Pointcut("@annotation(com.example.myproject.annoation.LogInfo)")
    public void pointcut() { }
 
    /**
    * 定義切點(diǎn),返回值為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());
    }
}

4.寫測(cè)試接口 

    /**
     * aop測(cè)試
     * 這里的user類和aop實(shí)現(xiàn)類中定義的returning值 User 保持一致,這樣aop中才能正確讀取到返回值
     * @param
     * @return
     */
    @LogInfo
    @PostMapping("/aopTest")
    public String aopTest(@RequestBody User user){
        return user.getUserName();
    }

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 為什么Java開發(fā)需要配置環(huán)境變量

    為什么Java開發(fā)需要配置環(huán)境變量

    這篇文章主要介紹了為什么Java開發(fā)需要配置環(huán)境變量,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-08-08
  • Spring Bean Scope 有狀態(tài)的Bean與無(wú)狀態(tài)的Bean

    Spring Bean Scope 有狀態(tài)的Bean與無(wú)狀態(tài)的Bean

    這篇文章主要介紹了Spring Bean Scope 有狀態(tài)的Bean與無(wú)狀態(tài)的Bean,每個(gè)用戶有自己特有的一個(gè)實(shí)例,在用戶的生存期內(nèi),bean保持了用戶的信息,下面來(lái)了解有狀態(tài)和無(wú)狀態(tài)的區(qū)別吧
    2022-01-01
  • java并發(fā)中DelayQueue延遲隊(duì)列原理剖析

    java并發(fā)中DelayQueue延遲隊(duì)列原理剖析

    DelayQueue隊(duì)列是一個(gè)延遲隊(duì)列,本文將結(jié)合實(shí)例代碼,詳細(xì)的介紹DelayQueue延遲隊(duì)列的源碼分析,感興趣的小伙伴們可以參考一下
    2021-06-06
  • Linux下java環(huán)境配置圖文方法

    Linux下java環(huán)境配置圖文方法

    這篇文章主要介紹了Linux下java環(huán)境配置圖文方法,需要的朋友可以參考下
    2023-06-06
  • Java與Python兩種編程語(yǔ)言的比較與應(yīng)用舉例詳解

    Java與Python兩種編程語(yǔ)言的比較與應(yīng)用舉例詳解

    這篇文章主要介紹了Java與Python兩種編程語(yǔ)言比較與應(yīng)用的相關(guān)資料,Java和Python各有特點(diǎn),Java適用于企業(yè)級(jí)應(yīng)用開發(fā),Python則在數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)領(lǐng)域占優(yōu)勢(shì),兩者在語(yǔ)法、應(yīng)用領(lǐng)域、性能、開發(fā)效率等方面存在差異,需要的朋友可以參考下
    2025-02-02
  • Java 添加文本框到PPT幻燈片過(guò)程解析

    Java 添加文本框到PPT幻燈片過(guò)程解析

    這篇文章主要介紹了Java 添加文本框到PPT幻燈片過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 最常用的1000個(gè)Java類(附代碼示例)

    最常用的1000個(gè)Java類(附代碼示例)

    這篇文章主要介紹了最常用的1000個(gè)Java類(附代碼示例),需要的朋友可以參考下
    2015-04-04
  • SpringBoot集成SpringSecurity安全框架方式

    SpringBoot集成SpringSecurity安全框架方式

    這篇文章主要介紹了SpringBoot集成SpringSecurity安全框架方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • java 串口通信實(shí)現(xiàn)流程示例

    java 串口通信實(shí)現(xiàn)流程示例

    這篇文章主要介紹了java 串口通信實(shí)現(xiàn)流程示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • java、php、C#、asp實(shí)現(xiàn)短信群發(fā)功能的方法

    java、php、C#、asp實(shí)現(xiàn)短信群發(fā)功能的方法

    這篇文章主要介紹了java、php、C#、asp實(shí)現(xiàn)短信群發(fā)功能的方法,以實(shí)例形式較為詳細(xì)的分析了java及php、C#、asp、VB.NET等調(diào)用短信發(fā)送接口進(jìn)行短信發(fā)送的功能,需要的朋友可以參考下
    2015-02-02

最新評(píng)論