Spring AOP中@AfterReturning通知绑定返回结果时无法执行的问题求助
解决Spring AOP @AfterReturning指定returning后通知不执行的问题
嗨,我之前也踩过类似的坑,来帮你捋捋问题出在哪~
首先你提到不指定returning参数时通知能正常执行,说明你的AOP基础配置(比如切面类加了@Aspect和@Component、Spring开启了@EnableAspectJAutoProxy)是没问题的,问题就出在returning参数的类型匹配上。
核心原因:泛型类型擦除
Java的泛型是编译期特性,运行时会被擦除,所以目标方法返回的List<Customer>在JVM里实际就是List类型。而你在通知方法里声明的List<Customer>参数,和pointcut表达式里的泛型返回类型,在运行时的类型匹配会出现偏差,导致Spring AOP找不到对应的返回值绑定,所以通知就不执行了。
可行的解决方案
方案1:修改通知方法的参数类型为无泛型List或通配符List
把参数改成List或者List<?>,这样就能匹配到擦除后的类型,之后如果需要操作Customer对象再做安全强转:
@AfterReturning( pointcut = "execution(public java.util.List<me.mikholskiy.domains.Customer> me.mikholskiy.daos.CustomerDao.getAll())", returning = "resultList" ) public void adviceBeforeGetAllCustomersFromDatabase(JoinPoint joinPoint, List<?> resultList) { // 确保类型安全的话可以先做instanceof判断 if (resultList instanceof List && !resultList.isEmpty() && resultList.get(0) instanceof Customer) { List<Customer> customers = (List<Customer>) resultList; // 你的业务逻辑... } }
方案2:修改Pointcut表达式的返回类型,去掉泛型
既然运行时泛型不存在,直接把pointcut里的返回类型写成java.util.List,这样就能和通知方法的参数类型完美匹配:
@AfterReturning( pointcut = "execution(public java.util.List me.mikholskiy.daos.CustomerDao.getAll())", returning = "resultList" ) public void adviceBeforeGetAllCustomersFromDatabase(JoinPoint joinPoint, List<Customer> resultList) { // 你的业务逻辑... }
额外排查点:检查Customer类的包路径
还要确认通知方法里导入的Customer类,和目标方法返回的me.mikholskiy.domains.Customer是同一个类,别不小心导错了包,这也是很容易忽略的小细节~
内容的提问来源于stack exchange,提问作者toiepp
相关产品推荐
相关产品推荐

