【发布时间】: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 合同的一部分,而且纯粹是字节码中通常不可用的源代码内容并且经常会发生变化。契约是方法签名。所以你要根据签名来区分你的切入点,比如方法返回类型、参数号、类型和顺序、方法注解、参数注解。
-
我认为你的观点很好。我需要重新思考我设计端点的方式。谢谢。