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("环绕结束...");
	}*/

 

你可能感兴趣的:(JAVA,Spring,AOP,@AfterReturning)