【问题标题】:Is it possible to get the return value and method arguments from the same advice in Spring AOP?是否可以从 Spring AOP 中的相同建议中获取返回值和方法参数?
【发布时间】:2022-05-04 01:46:41
【问题描述】:

是否可以从 Spring AOP 中的同一个通知中获取返回值和方法参数?

我正在尝试基于返回值和方法参数实现一些登录。

所有这些信息都需要在建议中使用以实现我的业务逻辑。

例如:

MyObject testMethod(String arg 1, String arg2){
    ..
    ..
    return myObject;
}

对于这种情况,我需要 myObject、arg1 和 arg2。

我在下面的代码中尝试了两个不同的注释:@After 和 @AfterReturning,如下所示:

@AfterReturning(value="execution(* com.example.aop.service.TestServiceImpl.printTestData(..))", returning="test")
public void checkSomethingAfter(JoinPoint joinPoint, Test test) {
    System.out.println("------------AFTER RETURNING-----------");
    System.out.println("After execution - 111 " + joinPoint.getArgs());
    System.out.println("After execution - test: " + test);
    System.out.println("-------------------------------------");
}

// @After(value = "execution(* com.example.aop.service.TestServiceImpl.printTestData(..)) and args()")
    @After(value = "execution(* com.example.aop.service.TestServiceImpl.printTestData(..)) && args(id)")
    public void afterAdvice(JoinPoint joinPoint, int id) {
        System.out.println("After method:" + joinPoint.getSignature());
        System.out.println("Creating Test with id - " + id);
    }

问题是,我在@After 中获取参数并在@Afterreturning 中返回值。我的要求是同时在一个方法中获取返回值和参数。

我该怎么做?

【问题讨论】:

    标签: java spring aop spring-aop


    【解决方案1】:

    这确实是可能的。您需要 @Around 建议并阅读 ProceedingJoinPoint 中的参数。

    
     @Around("execution(* com.example.MyClass.testMethod(..))")
     public Object testAop(ProceedingJoinPoint pjp) throws Throwable {
        Object[] arguments = pjp.getArgs();
        Object result = pjp.proceed();
        // Do logic based on arguments + return value
    
        return result;
    }
    

    我确实觉得实现可能会有点粗略,所以如果它不是一个真正的横切关注点,那么也许最好围绕该方法编写自己的委托。

    【讨论】:

    • 您能否就更新后的帖子进行更多解释?
    • @SwapnilHadge 这回答了你的问题:使用@Around。您的更新仅显示您尝试了 @After@AfterReturning,因此不清楚 Nico 需要解决什么问题,因为答案仍然是“使用 @Around”。
    • 这里的 around 建议会调用两次,即之前和之后。我需要在同一个方法中同时使用方法 arg 和返回值,以便我可以基于这两个值应用一些业务逻辑。这里发生的情况是第一次,我得到方法 args,在下一次执行时,我得到返回值。但是我在单次执行中没有得到方法参数和返回值。
    • @SwapnilHadge 你对@Around的理解是错误的。只有pjp.proceed() 会执行底层方法。没有调用两次下一次执行这样的东西
    • 是的..!感谢尼科的解释。我也理解这个概念和问题。将答案标记为正确。
    【解决方案2】:

    也可以使用@AfterReturning 注释。 这是一个例子。

    假设我们在com.test.TestService 类中有这个方法:

    public Object test(String arg1, Integer arg2) { ... }
    

    那么您的建议方法将如下所示:

    @AfterReturning(
            pointcut="execution(* com.test.TestService.test(..)) && args(arg1,arg2)",
            argNames="arg1,arg2,returnedValue",
            returning="returnedValue")
    public void logAfterTest(String arg1, Integer arg2, Object returnedValue) {
        // some logic
    }
    

    【讨论】:

      猜你喜欢
      • 2017-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 1970-01-01
      相关资源
      最近更新 更多