解决Aop @AfterReturning因返回类型不一致导致无法执行切面代码
作者:恐丶
这篇文章主要介绍了解决Aop @AfterReturning因返回类型不一致导致无法执行切面代码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
Aop @AfterReturning因返回类型不一致导致无法执行切面代码
要做返回异常之后,所有操作回滚的操作,本来想着泛型用 Object 就表示所有返回类型是 CommonResult 并且加指定注解的都走这个通知的代码,但是如下配置,无论如何也不生效
进入源码里发现,判断是否执行这个 advice 会判断被注解的方法的返回类型和通知方法的参数泛型是否一致
解决方法
就是把 afterReturning 通知的参数的泛型去掉。
AOP @AfterReturning的使用
首先引入依赖
<!--spring AOP的支持 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
定义一个注解作为切点
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LogInfo { String value() default ""; }
写aop实现
@Aspect @Component @Slf4j public class LogInfoAspect { /** * 配置切点 切点为注解 意为有该注解的地方日志生效 */ @Pointcut("@annotation(com.example.myproject.annoation.LogInfo)") public void pointcut() { } /** * 定义切点,返回值为user,要与下面方法中的入参名user保持一致 * returning的是获取到要提取日志的方法的返回值 */ @AfterReturning(pointcut = "pointcut()",returning = "user") public void afterReturning(Object user){ User user1 = (User) user; log.info("用户Id为:" + user1.getUserId()); log.info("用户名称为:" + user1.getUserName()); } }
写测试接口
/** * aop测试 * 这里的user类和aop实现类中定义的returning值 User 保持一致,这样aop中才能正确读取到返回值 * @param * @return */ @LogInfo @PostMapping("/aopTest") public String aopTest(@RequestBody User user){ return user.getUserName(); }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。