问题代码展示
@Override@Around("@annotation(sessionChange)")public void aroundSessionChange(SessionChange sessionChange) {SessionChangeAspect.super.aroundSessionChange(sessionChange);}
/*** 模拟登录* @return*/@GetMapping("/logon")@SessionChange(increment = true)public String logon() {return "登录成功";}
问题分析与解决
-
切面方法的签名和用法:
aroundSessionChange
方法的定义有误。@Around
注解的方法应该接收一个ProceedingJoinPoint
类型的参数,而不是注解类型的参数。ProceedingJoinPoint
提供了继续执行拦截方法的能力。
-
调用
proceed()
方法:- 在
@Around
注解的方法内,你需要调用joinPoint.proceed()
来继续执行原始的方法调用。如果没有调用这个方法,原始方法(如你的logon
方法)将不会被执行,这解释了为什么没有输出。
- 在
正确的实现
这里是 aroundSessionChange
方法的一个正确实现示例:
@Around("@annotation(sessionChange)")
public Object aroundSessionChange(ProceedingJoinPoint joinPoint, SessionChange sessionChange) throws Throwable {try {// 在原始方法之前的逻辑,比如增加会话计数// 继续执行原始方法return joinPoint.proceed();} finally {// 在原始方法之后的逻辑,比如减少会话计数}
}
在这个实现中,joinPoint.proceed()
负责继续执行被 @SessionChange
注解标记的方法。这确保了你的 logon
方法能够被执行,并且其返回值(“登录成功”)能够被正确处理。
总结
logon
方法没有输出预期的消息,很可能是因为切面方法没有正确实现,导致原始方法没有被执行。请确保你的切面方法遵循了正确的 @Around
注解用法,并且正确地调用了 joinPoint.proceed()
。