Spring AOP:执行验证

时间:2014-06-07 17:09:47

标签: java spring spring-aop

我在具有此代码的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
    }
}

如果验证失败,那么我不想调用调用方法,并希望从建议本身返回。我不知道如何执行此操作。请指教。

3 个答案:

答案 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建议。