execution 切点写成 com.api.service.*.*,同层的方法能切到,service 下子包里的方法全部漏掉,日志里没有任何通知。乍看像缓存或者权限的锅,追下去往往不是。
@Pointcut('execution(* com.api.service..*.*(..))')
public void serviceLayer() {}
追下去是这么回事:包路径里的单个星号只匹配一层目录,子包属于更深层级,要匹配任意层得用两个点,范围写窄了。
「切点包匹配」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。
权限不要一口气开到最大,先加到够用再往上试,范围小才好收。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
具体做法是,包路径改成 com.api.service..*.*(..);把切点抽成 @Pointcut 统一复用;启动后核对切面命中日志。
验收就看一点,子包里的方法被调用后,切面日志同样有输出。
