当前位置: 首页 > 知识库问答 >
问题:

Afterreturn注释不适用于特定的方法结构[重复]

鲜于德业
2023-03-14

我试图使用AspectJ的@AfterReturning来获取特定函数调用的返回值。

不确定为什么@AfterReturn对下面的方法调用不起作用。

@AfterReturning(
  pointcut = "execution(org.springframework.http.ResponseEntity com.service.QueryGenerationService.method1(*))",
  returning = "retVal"
)
public void interceptMethod1(ResponseEntity retVal) {
  System.out.println(retVal+"---->");
}
@AfterReturning(
  pointcut = "execution(com.entity.ReportGenerationExportResult com.service.QueryGenerationService.method2(com.entity.ReportGenerationServiceRequest, com.entity.querybuilder.QueryBuilderResponse))",
  returning = "retVal"
)
public void interceptMethod2(ReportGenerationExportResult retVal) {
  System.out.println(retVal);
}
@AfterReturning(
  pointcut = "execution(* com.service.QueryGenerationService.method2(*, *))",
  returning = "retVal"
)
public void test1(Object retVal){
  System.out.println(retVal);
}

存在2个方法的服务类

@Service
public class QueryGenerationService {

  public ResponseEntity method1(
    ReportGenerationServiceRequest request
  ) throws Exception
  {
    //some logic
    ReportGenerationExportResult exportResult = method2(request, queryBuilderResponse);
    return toResponseEntity(exportResult);
  }

  public ReportGenerationExportResult method2(
    ReportGenerationServiceRequest originalRequest,
    QueryBuilderResponse queryBuilderResponse
  ) throws Exception
  {
    //some logic
    return reportGenerationExportResult;
  }
}

如何才能成功地获得第二个方法的返回值?

共有1个答案

汤乐家
2023-03-14

这一个是经典:你在错误的地方寻找答案。问题不在于切入点,您的应用程序类与Spring AOP基于代理的特性相结合:

正如Spring手册在理解AOP代理一章中清楚地解释的那样,Spring AOP不适用于自调用。

您的method2是直接从method1调用的,而不是从外部调用,因此方法调用是到原始对象,而不是到AOP代理。因此,没有任何方面会在那里开火。

如果您需要使用自调用的方面,您需要从Spring AOP切换到全功能的ASpectJ,如下所述。

 类似资料:
  • 问题内容: 我已经考虑了很长时间了,我需要一种对数据库中的注释添加答复的方法,但是我不确定如何进行。 这是我当前的注释表(不多说,只是一个开始): 这是我当前的查询: 一种选择是创建一个名为“ comment_replies”的新表,但是我不确定是否能够在一个查询中选择所有评论和评论回复,如果我添加了一个名为“ reply”的新列,不知道如何对它们进行排序,以获取每个回复的每个评论。 我很想获得一

  • 我是Spring的新手,我很困惑@CreatedDate注释在实体中是如何工作的。 我做了一次谷歌搜索,有很多解决方案,但除了一个,没有一个适合我。我很困惑为什么? 这是我先试的 它不起作用。我为列中的值获取了NULL。 然后我做了这个。 这实际上将时间戳存储在db中。我的问题是,我遵循的大多数教程都建议我不需要来获取当前时间戳。看起来我确实需要它。我缺少什么吗?

  • 错误在此输入图像描述 我试图发送事件的通知,当一些喜欢和评论他的帖子,通知评论和喜欢在这里工作是我的通知类。 我的控制器功能代码,用于通知评论 我的请求

  • 我试图让RunWith(PowerMockRunner.class)处理我现有的包注释。 版本: Powermock 1.4.12 mockito 1.9.0 jUnit 4.8.2 package-info.java//这是包注释 测试说明。java//这是包“com.smin.dummy”的元数据注释类 A、 爪哇 莫卡。Java语言 在unitest MockA中。如果我不使用RunWith

  • 环境:科特林 1.5.30, 春靴 2.5.4(Spring 5.3.9) 我试图创建一个组合注释来简化类似的模板注释代码。注释类如下: 预期用法: application.yaml: 但在应用程序启动后,TheBean 未按预期注册。 > 首先,我在github spring存储库中搜索,发现了这个:回归:自定义组合@Profile注释,组件扫描不再支持没有运行时保留。所以我试图但没有效果。 尝

  • 我已经编写了整型适配器,并用作注释来实现以下输出,但在gson库中编写的代码完全不允许使用注释配置进行空处理。 如果我取消注释1,2,4行和注释3行,那么我仍然没有实现我的愿望输出。 当我调试第189行的库代码(给定的屏幕截图)时,没有到达我的自定义适配器代码,因此空处理无法使用注释。有没有其他方法可以根据注释配置实现所需的输出? 期望输出: 猫科动物 - "" (用作注释并具有空值) phone