@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()
。