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

在AOP(AspectJ)中通过注释访问函数参数

邹祺然
2023-03-14

我在MyController类下有一个函数:

@RestController
@RequestMapping(value = "/api/service")
public class MyController {

   @PostMapping(value = "add_person")
   public MyResponse addPerson(@RequestBody Person person) {
       // ...
   }

   @PostMapping(value = "add_person_2")
   public MyResponse addPerson(@PathVariable(value = "person_age") Int age, @RequestBody Person person) {
       // ...
   }
}

我在我的项目中设置了AspectJ,以便在这两个addPerson(…)时运行AOP逻辑上述方法称为:

@Around("execution(public MyResponse addPerson(..))")
public void around(ProceedingJoinPoint joinPoint) {
   // NO matter which addPerson(...) is executing, I am only interested in the
   // parameter value annotated with @RequestBody.
   // How can I access the parameter that passed in addPerson(...) & is annotated with
   // @RequestBody through ProceedingJoinPoint ?
}

我的问题在上述代码注释中提到。我想知道如何访问AOP函数中用RequestBody注释的参数?我不想检查参数类型或名称,但想知道如何通过检查注释来访问参数。有可能吗?

共有1个答案

慕容宏毅
2023-03-14

我不想把这个问题标为重复,因为它不是完全重复的,但是我在这里的回答应该回答关于如何

  • 在任何位置匹配带注释的参数,
  • 获取参数值本身的注释

链接的答案在建议之前使用了一个。如果您想在调用procedue()时,以某种方式将通知中的值替换为另一个值,这也是可能的,但这里没有询问,我要求查看更多通知方法体的请求也被忽略。

如果要限制为带注释的Person参数,则必须使用完全限定的类名my。包裹Person而不是*中的(*),并在访问通知正文中的参数后执行相应的强制转换。

在我的注释中,我还询问了参数在参数列表中是否有固定的相对位置,例如第一个、最后一个或从左到右的第二个/第三个。如果OP确认了这样一个固定的相对位置,反射就没有必要了,相应的参数可以通过args()切入点指示符直接绑定到通知方法参数。这将非常优雅,并且无需循环遍历getArgs()或参数注释的二维数组。

 类似资料:
  • 我用AspectJ编写了一个方法,并对其应用了一个建议。在advice逻辑中,我希望访问该方法的所有注释参数。我这样做是为了过滤我正在寻找的特定注释。 问题是,在我调用后,我收到了一个数组。我可以在那里找到我正在寻找的预期参数。但是,当我想访问该参数的注释类型时——因为我想按其类型过滤——没有注释存在。 我希望它会出现-因为它说它是一个带注释的类型-那么注释在哪里:D 这是要查看的代码 日志输出

  • 在执行通知时,如何获取的和?我正在使用Spring 4.0.6、AspectJ 1.7.4

  • 我创建了一个方面,用于在某些方法执行之前拦截它们,使用AspectJ如下所示 编写的自定义注释如下所示 我面临的问题是我的方法中的第二个论点。如果我试图在我的方面中获得注释作为第二个参数,应用程序将以下面的错误开始失败。 由:java.lang.IllegalArgumentException引起:错误::0在org.aspectj.weaver.tools.pointCutParser.Pars

  • 问题内容: 是否可以通过注释处理器访问带有注释的元素? 是否可以通过注释处理器访问带注释的类型边界? 高度赞赏我错过的相关文档的链接。 内容: 注释: 一个示例类: 处理器: 在classpath 上使用编译以上内容将显示消息,但永远不会调用该方法。当方法参数中存在注释时,使用注释向处理器添加另一个注释可以正常工作。如果方法参数带有注释,则过程将再次忽略该元素。 问题答案: 该注释是有点棘手,因为

  • 我正在尝试使用简单的自定义@NotNull注释对我的方法执行空检查,即我将方法声明为,当有人调用此方法并将空值作为'name'参数传递时,会引发异常。 我已经使用aspectj实现了一个简单方面。这个解决方案对我来说很有效。一个例外是内部类的构造函数。在这种情况下,由于java内部的异常,方面崩溃。郎。反思。参数: 简化的实施: 方面: 注释: 测试等级: 据我所知,这是由java将封闭的类对象作

  • 问题内容: 我刚刚开始学习Go,有些事情引起了我的注意。 功能如下: 等等。作为来自C语言的人,我想知道: 1)是否可以通过变量本身来调用这些函数(如中所述)? 2)这是一种常见的做法(定义泛型函数并让其找出类型及其应执行的操作),还是仅用于内置类型。例如,如果我要定义自己的类型,例如,是否应该在类型内定义和附加函数,并将其命名为 还是应该定义一个接收列表的函数,例如: 问题答案: 1-您不能将内