Spring Boot中AspectJ Before/After切点不触发方法出入日志求助
问题根因及修复方案
1. 修复切面语法错误(直接导致启动失败)
你代码里@AfterThrowing注解的切点表达式多了1个多余的右括号,属于AspectJ语法错误,直接导致Spring上下文初始化失败,Tomcat无法启动:
// 错误写法,末尾多了一个) @AfterThrowing("execution(* com.demo.*.*(..)))") // 修正后写法 @AfterThrowing("execution(* com.demo.*.*(..))")
2. 修正切点表达式(解决切面不生效问题)
当前切点execution(* com.demo.*.*(..))仅匹配com.demo包下直接定义的类的方法,不会匹配controller、service等子包下的类,需要修改为匹配所有子孙包的写法:
// 修正后,com.demo后面加两个点,匹配当前包及所有子孙包下的所有类的所有方法 @Before("execution(* com.demo..*.*(..))") @After("execution(* com.demo..*.*(..))") @AfterThrowing("execution(* com.demo..*.*(..))")
如果要避免切到Spring自带的配置类,可以再缩小范围,比如只切controller和service包:execution(* com.demo.controller..*.*(..)) || execution(* com.demo.service..*.*(..))
3. 清理冗余依赖(避免版本冲突)
spring-boot-starter-aop已经内置了spring-aop、aspectjrt、aspectjweaver三个依赖,不需要单独手动引入,直接删除pom.xml中这三个单独的依赖即可,避免版本不一致导致的启动异常:
<!-- 只保留这一个依赖即可 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency>
4. 调整注解配置(避免初始化顺序问题)
@EnableAspectJAutoProxy建议移到启动类Application.java上,不要放在切面类本身,避免切面类加载顺序异常导致代理不生效。
附加注意事项
如果打印的traceId为空,需要确认你已经在请求入口(比如全局过滤器、拦截器)中提前将traceId存入了MDC,且异步场景下需要单独处理MDC的上下文传递。
内容的提问来源于stack exchange,提问作者Saawan
相关产品推荐
相关产品推荐

