【问题标题】:Can pointcut expressions match generic parameter in Java methods?切入点表达式可以匹配 Java 方法中的泛型参数吗?
【发布时间】:2020-01-28 03:59:04
【问题描述】:

我的问题是我的切入点表达式似乎不匹配方法调用,因此没有被执行。我怀疑它与参数列表中的泛型有关。

我尝试匹配的方法具有以下签名(实际名称被混淆):

public <T> ResponseEntity<T> doSomeAction(String a, Class<T> b, Object c, String d, String e) {
}

还有另一个方法调用具有以下我不想匹配的签名,但我想我可以通过参数编号过滤掉。唯一的区别是它少了一个参数(即没有字符串 e)。

public <T> ResponseEntity<T> doSomeAction(String a, Class<T> b, Object c, String d) {
}

使用的切入点表达式是

@Before("execution (* packageNames.doSomeAction(..))
public void doAdvce(JointPoint joinPont) {
}

搜索了一下,我确实找到了related,但我不能说我明白。

有人能解释一下吗?

【问题讨论】:

  • 欢迎来到 SO。您的 sn-ps 不包含足够的信息来回答问题。我还需要查看带有包名、导入和完整方面的完整类。请注意了解MCVE 是什么以及如何提出好的问题,然后编辑您的问题并在评论中通知我。
  • 如果切点表达式有效,可以建议具有给定签名的方法。提供的问题不正确/无效。分享一个完整的例子或相关的类(配置、方面类、带方法拦截的类)以便我们提供帮助

标签: java spring aspectj spring-aop spring-aspects


【解决方案1】:

根据 spring 文档,https://docs.spring.io/spring/docs/4.0.x/spring-framework-reference/html/aop.html 您可以明确指定预期的参数,如

execution(* doSomeAction(java.lang.String,java.lang.Class,java.lang.Object,java.lang.String,java.lang.String))

【讨论】:

    【解决方案2】:

    您不能根据参数的泛型进行匹配,as stated in the Spring Framework reference documentation(以Collection&lt;T&gt; 为例,但似乎这会影响所有泛型)。 Spring 建议执行以下操作:

    要实现类似的效果,您必须将参数键入Collection&lt;?&gt; 并手动检查元素的类型。

    所以试试这个:

    public <T> ResponseEntity<T> doSomeAction(String a, Class<?> b, Object c, String d, String e) {
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      相关资源
      最近更新 更多