【问题标题】:Pointcut not working for generic interface切入点不适用于通用接口
【发布时间】:2009-07-15 14:54:07
【问题描述】:

我正在使用 Spring 框架 (2.5),它是 AOP 功能。我有一个切入点表达式,比如

@Pointcut("execution(public * org.springframework.batch.item.ItemReader+.read(..))")
public void itemReaderMethods() {}

ItemReader interface 是一个 Spring 接口,它的签名是:

org.springframework.batch.item.ItemReader<T>

接口有一个名为“read”的方法,我想对其应用建议:方法签名是:

org.springframework.batch.item.ItemReader.read()

但是,当我使用上面的切入点表达式运行我的应用程序时,我得到了以下异常:

java.lang.IllegalArgumentException:警告此类型名称不匹配:org.springframework.batch.item.ItemReader [Xlint:invalidAbsoluteTypeName]

我的猜测是,由于 ItemReader 是一个通用接口,所以切入点没有正确匹配。如果是这种情况,我怎样才能编写我的切入点表达式来匹配泛型接口?

【问题讨论】:

  • 事实并非如此。由于类型擦除,它不会区分泛型参数。

标签: java spring aop


【解决方案1】:

泛型对我来说似乎不是问题 - 我可以在 Map 操作上创建一个测试切入点:

@Around(value="execution(* java.util.Map.size(..))")

我也不需要使用 Map+(我认为那是因为我们使用了接口),而且 Map 的通用性也无关紧要。

您确定 ItemReader 接口类可用并且您有可用的实现吗?这就是错误消息所暗示的(如果我在我的测试切入点中放置一个虚拟类名,我可以得到它)。也许尝试记录/打印

Class.forName("org.springframework.batch.item.ItemReader")

对于您预期的实现类也是如此?

【讨论】:

    猜你喜欢
    • 2010-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-16
    • 2021-05-14
    • 2015-02-10
    相关资源
    最近更新 更多