# 打开 AOP 调试日志看代理类型
logging.level.org.springframework.aop=DEBUG
# 日志里区分 JdkDynamicAopProxy 与 CglibAopProxy

同一个包下其他 Service 的切面都正常,唯独这个类里的方法一条通知都没有,排查发现方法签名上多了个 final。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,Spring 默认用 CGLIB 生成子类代理,final 方法不能被重写,调用直接走原方法,事务和通知一起被绕过。

这次卡住的地方就在「final 方法代理」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。

处理上按这个顺序:去掉方法上的 final 修饰符;或把方法声明到接口上走 JDK 代理;确认类本身也不是 final。

改完只确认一件事:启动日志能看到代理类型,去掉 final 后切面正常输出。

作者 9823189