【问题标题】:Spring AOP, pointcuts triggered according to path variable nameSpring AOP,根据路径变量名触发切入点
【发布时间】:2016-09-02 22:54:04
【问题描述】:

我希望根据我在 URL 中命名路径变量的方式触发我的切入点之一。

事实是它是一个字符串,我不希望我的切入点在每个字符串上都被触发。

@Pointcut("@annotation(security.annotation.RequireValidUser) && args(datasetName, ..)")
private void methodAnnotatedForValidDatasetName(String datasetName) {
}

在我的例子中,这个切入点是在这个方法中成功触发的(没关系):

public ResponseEntity<ApiKeyDTO> createApiKey(@PathVariable("name") String datasetName, @RequestBody ApiKeyDTO apiKeyDTO)

但是这里也触发了(我不想要的):

public ResponseEntity<List<ApiKeyDTO>> findApiKeyFromDatasetLabel(@PathVariable("label") String datasetLabel)

我想知道是否有任何解决方法可以让切入点能够通过它们的命名来区分不同的字符串?

编辑:正如@kuhajeyan 所建议的,我尝试使用“argNames”,如下所示:

@Pointcut(value = "@annotation(security.annotation.RequireValidUser) && args(datasetName, ..)", argNames = "datasetName")

不幸的是,它没有按预期工作,它仅指定切入点内的参数名称。

【问题讨论】:

  • 您不想匹配参数名称 - 坏主意! - 因为它们不是 API 合同的一部分,而且纯粹是字节码中通常不可用的源代码内容并且经常会发生变化。契约是方法签名。所以你要根据签名来区分你的切入点,比如方法返回类型、参数号、类型和顺序、方法注解、参数注解。
  • 我认为你的观点很好。我需要重新思考我设计端点的方式。谢谢。

标签: java spring aop pointcut


【解决方案1】:

你可以使用 argName ,记录在here

参数名称

@Pointcut(value="@annotation(security.annotation.RequireValidUser) && args(name,..)",  argNames="datasetName")
private void methodAnnotatedForValidDatasetName(String datasetName) {
}

【讨论】:

  • 谢谢,我想我在浏览此文档时错过了它,我的错。
  • 好吧,我用 argNames 进行了测试,就像这样:@Pointcut(value = "@annotation(security.annotation.RequireValidUser) &amp;&amp; args(datasetName, ..)", argNames = "datasetName") 但不幸的是,它没有按预期工作。 argNames 用于显式指定切入点的参数名称,但不过滤触发切入点的方法的参数。
  • @Rlarroque 你是对的。我已经测试过了。不确定编译后是否仍然可行,不确定是否保留了参数名称。例如,您始终可以在更改参数名称的情况下覆盖接口中的方法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多