spring @AfterReturning返回值问题

 更新时间:2024年05月10日 10:21:25   作者:巴中第一皇子  
这篇文章主要介绍了spring @AfterReturning返回值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

spring @AfterReturning返回值

@AfterReturning是用于做aop的,其中返回值的问题,坑了我比较久,特地写出来。

1. 正确的使用

@AfterReturning(value = "pointCut()", returning = "obj")
public Object doAfterReturning(JoinPoint joinPoint, Object obj) {
    // 正常情况下,我们想要修改obj,只需要强转为对应的对象,再重新设置值即可,如下
    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;
}

区别就是方式一并没有更改obj的引用指针地址,返回结果是更新了name属性后的用户

而方式二更改了obj引用指针,返回结果并不是新new的user对象,而是入参obj对象

所以使用时要注意:

AfterReturning方法虽然能修改返回值,但是局限于相同的对象地址,即最后返回对象的引用地址和入参的引用地址必须相同。

所以能修改返回值的也只有引用类型,基本类型是不允许的

@AfterReturning方法执行了,但是切入方法没执行

首先,在一个批量插入的方法定义了切入点

    @Pointcut(value = "execution(* com.cases.dao.mapper.duty.DutyTableDao.insertBatch(..))")
    public void pointcut() {
        log.info("DutyDeleteInterceptor:pointcut");
    }

@AfterReturning方法可以正常进入,但是批量插入insertBatch方法却没有执行。

原因就在@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();
    }

调试,成功。

小知识:

 joinPoint.proceed() 的返回值是Object类型,Object result = joinPoint.proceed();

其实这句代码的意思就是正常去执行我们的业务,返回值result,在错误代码中,返回值写成了void,所以正常业务拿不到返回值了

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring Security OAuth2集成短信验证码登录以及第三方登录

    Spring Security OAuth2集成短信验证码登录以及第三方登录

    这篇文章主要介绍了Spring Security OAuth2集成短信验证码登录以及第三方登录,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 使用Feign调用时添加验证信息token到请求头方式

    使用Feign调用时添加验证信息token到请求头方式

    这篇文章主要介绍了使用Feign调用时添加验证信息token到请求头方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Springboot ApplicationRunner的使用解读

    Springboot ApplicationRunner的使用解读

    这篇文章主要介绍了Springboot ApplicationRunner的使用解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • java中的IO流

    java中的IO流

    这篇文章主要介绍了java中的IO流的相关资料,需要的朋友可以参考下文
    2021-08-08
  • spring cloud如何集成nacos配置中心

    spring cloud如何集成nacos配置中心

    这篇文章主要介绍了spring cloud如何集成nacos配置中心操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • Java实现给微信群中定时推送消息

    Java实现给微信群中定时推送消息

    这篇文章主要为大家详细介绍了Java如何实现给微信群中定时推送消息的功能,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以了解一下
    2022-12-12
  • 强烈推荐这些提升代码效率的IDEA使用技巧

    强烈推荐这些提升代码效率的IDEA使用技巧

    在平常的开发中,发现一些同事对Idea 使用的不是很熟练,仅仅用来编辑,编译,不能很好的发挥Idea 的神奇.整理了下我平常用的一些技巧,希望你能从中学习到一些.需要的朋友可以参考下
    2021-05-05
  • Springboot中@scheduled注解解析

    Springboot中@scheduled注解解析

    这篇文章主要介绍了Springboot中@scheduled注解解析,定时任务就是在指定时间执行程序,或周期性执行计划任务,Java中实现定时任务的方法有很多,本文从从JDK自带的一些方法来实现定时任务的需求,需要的朋友可以参考下
    2023-09-09
  • Java 图表类库详解

    Java 图表类库详解

    本文主要介绍了Java图表类库的相关知识。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-01-01
  • Spring Mvc中CommonsMultipartFile的特性实例详解

    Spring Mvc中CommonsMultipartFile的特性实例详解

    这篇文章主要给大家介绍了关于Spring Mvc中CommonsMultipartFile特性的相关资料,SpringMVC拥有强大的灵活性,非侵入性和可配置性,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11

最新评论