Spring AOP切面通过@AfterReturning获取返回参数时返回null

@AfterReturning如果和@Around一起使用,那么就需要给@Around的方法设置返回参数,因为@AfterReturning接收到的值其实是@Around返回的。

如果@Around的方法没设置返回参数,有2种可能:

1.@AfterReturning接收到的返回值为null

2.如果目标方法的返回值类型不是封装类型如Integer,而是基本类型比如int,则执行会报错:

org.springframework.aop.AopInvocationException: Null return value from advice does not match primitive return type for: public abstract int cn.e_aop_anno.IUserDao.deleteById(int)

如果将目标方法返回类型改成封装类型如Integer,则执行不报错,但是接收到的返回值为null;即可能1写的结果。

// 指定切入点表达式:拦截哪些方法,即为哪些类生成代理对象
	@Pointcut("execution(* cn.e_aop_anno.*.*(..))")
	public void pointCut_() {}

// 返回后通知:在调用目标方法结束后执行【出现异常,不执行】
	@AfterReturning(value="pointCut_()",returning="retValue")
	public void afterReturning(JoinPoint jp, Object retValue) {
		System.out.println("Aop.afterReturning() 目标方法+"+jp.getSignature().getName()+"返回值:" + retValue);
	}

	@Around(value="pointCut_()")
	public Object around(ProceedingJoinPoint pjp) throws Throwable {
		System.out.println("环绕开始...");
		Object retValue = pjp.proceed();// 执行目标方法
		System.out.println("环绕结束...");
		return retValue;
	}

    /*
     *此时要么执行报错类型不匹配,要么@AfterReturning的返回值retValue是null
    @Around(value="pointCut_()")
	public void around(ProceedingJoinPoint pjp) throws Throwable {
		System.out.println("环绕开始...");
        pjp.proceed();// 执行目标方法
		System.out.println("环绕结束...");
	}*/

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
@AfterReturning注解用于在目标方法执行后执行切面方法。它有两个参数,value用于指定切入的位置,returning用于指定切入的目标类的返回值。在切面方法中,可以通过returning参数获取目标方法的返回值,并对返回值进行篡改。举个例子,假设我们有一个切入点为com.daji.aop_test.AopTestController.test1的方法,我们可以在该方法执行后执行一个切面方法,通过returning参数获取方法的返回值,然后可以对返回值进行处理。在切面方法中,可以使用JoinPoint对象获取方法的参数和其他信息。要注意的是,@AfterReturning注解并不能实现对返回值的真正篡改,它只能将篡改后的值返回给调用方。如果希望真正篡改返回值,需要使用@Around注解。@Around注解可以在目标方法执行前后执行切面方法,并且可以对返回值进行篡改。使用@Around注解,可以通过ProceedingJoinPoint对象获取方法的参数,执行方法,并获取返回值,然后对返回值进行处理。同,@Around注解还可以篡改方法的入参。举个例子,假设我们有一个切入点为com.daji.aop_test.OriFuncImpl.ori的方法,我们可以在该方法执行前后执行一个切面方法,通过ProceedingJoinPoint对象获取方法的参数,执行方法,并获取返回值,然后对返回值进行处理。需要注意的是,在使用@Around注解,需要调用joinPoint.proceed(args)来执行目标方法,并获取返回值。然后可以对返回值进行处理并返回给调用方。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [abjectj--@AfterReturning讲解](https://blog.csdn.net/qq_39071012/article/details/117624836)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Spring AOP之@Around,@AfterReturning使用、切不进去问题解决](https://blog.csdn.net/weixin_44757863/article/details/123231410)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值