最近在测试接口时,总是调用两次,于是在aop找原因
错误原因:在aop的@Around这个接口中出现了两次ProceedingJoinPoint.proceed(),于是我将该信息赋值给一个变量,后调用这个变量即可解决。
ProceedingJoinPoint.proceed()使用多少次,则会调用controller多少次!!!
因为不知其所以然,还请了解原因的前辈们告知原因。
附上代码
@Aspect
@Component
public class HttpLoggerRespect {
private final Logger logger = LoggerFactory.getLogger(HttpLoggerRespect.class);
@Pointcut("execution(public * com.bigdata.bigdata.controller..*(..))")
public void logPointCut() {
logger.debug("审计使用");
}
@Around("logPointCut()")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
// result的值就是被拦截方法的返回值
Object result =pjp.proceed(); ///错误原因导致1
System.out.println(pjp.proceed()); ///错误原因导致2
if(result instanceof ConstraintViolationException){
throw new ConstraintViolationException(((ConstraintViolationException) result).getConstraintViolations());
}
return result;
}
}
调用controller
@RestController
@RequestMapping("/user")
public class UserController {
private static final Logger logger= LoggerFactory.getLogger(UserController.class);
@PostMapping("/test")
public Object postEvent(@RequestParam("name") String name) throws Exception {
logger.info("接口进入");
return "successs";
}
}
调用该接口
解决办法:
将上面的HttpLoggerRespect 上面的System.out.println(pjp.proceed());修改为System.out.println(result);即可。
原因的前辈们告知原因!!!抱拳



