使用 AspectJ 仅拦截 void 返回调用

发布于 2024-09-27 18:20:38 字数 443 浏览 4 评论 0原文

我有一个应该记录的跟踪方面:

  • Entering
  • Exiting (return type is void)
  • Returning [returned object]
  • Throwinig [Exception message]

我遇到了第二个问题。如何在不双重记录所有退出的情况下创建建议​​,这些退出也返回一些内容,就像现在的情况,当我有一个 @After 建议和一个 @AfterReturning(value = "publicMethodCall()", returned = "o") 。我是否可以以某种方式为 void 返回调用 @AfterReturning 建议,并且在返回非 void 时仍然检索其值(可能不是,因为无法判断方法是否返回 null 或者返回类型是否为 void)。

我猜这应该很容易,但我看不到......

I have a trace aspect that should log:

  • Entering
  • Exiting (return type is void)
  • Returning [returned object]
  • Throwinig [Exception message]

I am having problems with the second. How do I create an advice for this case without double-logging all exits that also return something as is the case now when I have one @After advice and one @AfterReturning(value = "publicMethodCall()", returning = "o"). Can I somehow have the @AfterReturning advice be called for void returns and still retrieving its value when it returns are non-void (probably not as it would be impossible to tell if the method returned null or if the return type was void).

I a, guessing this should be easy but I can't see it...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

明明#如月 2024-10-04 18:20:38

使用 around 建议会更简单。一对切入点/建议。 (我在这里使用代码风格的aspectj语法,因为我更喜欢它)。如果您需要,我可以转换为 @AspectJ 样式:

Object around() : publicMethodCall() {
  try {
    Object result = proceed();
    log(result, thisJoinPoint);
    return result;
  } catch (Throwable t) {
    log(t, thisJoinPoint);
    throw t;
  }
}

在这里,如果您的方法返回 void,则 结果 将为 null

It would be simpler to use around advice. One pointcut/advice pair. (I am using the code style aspectj syntax here because I prefer it). I can translate to @AspectJ style if you need:

Object around() : publicMethodCall() {
  try {
    Object result = proceed();
    log(result, thisJoinPoint);
    return result;
  } catch (Throwable t) {
    log(t, thisJoinPoint);
    throw t;
  }
}

Here, if your method returns void, then the result will be null.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文