我在具有此代码的Aspect中执行了一些验证:
public void beforeMethodExecJoinPoint(JoinPoint jp){
System.out.println("Invoking Method: " + jp.toString());
System.out.println("Args passed: " + Arrays.toString(jp.getArgs()));
if(Arrays.toString(jp.getArgs()).contains("XXX")){
System.out.println("True"); // Need to replace this
}
}
如果验证失败,那么我不想调用调用方法,并希望从建议本身返回。我不知道如何执行此操作。请指教。
答案 0 :(得分:2)
使用周围的建议。在该方法的ProceedingJoinPoint参数中,如果您不希望运行目标方法而是返回您喜欢的内容,请不要调用proceed()方法。这里有一些不同的代码供您理解:
public Object methodExecutionMonitor(ProceedingJoinPoint pjp) throws Throwable {
long startTime = System.nanoTime();
Object retVal = pjp.proceed();
long endTime = System.nanoTime();
System.out.println("Method execution time (ns): " + pjp.getSignature() + " "
+ (endTime - startTime));
return retVal;
}
答案 1 :(得分:1)
使用之前的建议,如果不改变很多Spring AOP基础设施,这是不可能的。
目前,它使用MethodBeforeAdviceInterceptor
实现,该public Object invoke(MethodInvocation mi) throws Throwable {
this.advice.before(mi.getMethod(), mi.getArguments(), mi.getThis() );
return mi.proceed();
}
调用before建议,然后继续使用建议方法的调用。代码是
{{1}}
因此,终止执行的唯一方法是抛出异常。你可能不希望这样。
做卡迈勒的建议并使用周围的建议。
答案 2 :(得分:1)
首先,您之前的建议可能会抛出最终可能被调用者捕获的运行时异常。如果不能使用异常,则必须使用around建议。