Pointcut не работает для универсального интерфейса - PullRequest
2 голосов
/ 15 июля 2009

Я использую Spring Framework (2.5) и его функции AOP. У меня есть выражение pointcut, например

@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()

Но, когда я запускаю свое приложение с приведенным выше выражением pointcut, я получаю следующее исключение:

java.lang.IllegalArgumentException: предупреждение не соответствует имени этого типа: org.springframework.batch.item.ItemReader [Xlint: invalidAbsoluteTypeName]

Я предполагаю, что, поскольку ItemReader является универсальным интерфейсом, pointcut не соответствует должным образом. Если это так, как я могу написать свое выражение pointcut, чтобы оно соответствовало также и универсальным интерфейсам?

1 Ответ

1 голос
/ 15 июля 2009

Обобщения не кажутся мне проблемой - я могу создать тестовую точку на операциях с картой:

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

Мне также не нужно было использовать Map + (я полагаю, это потому, что мы используем интерфейсы), и общая природа Map тоже не имела значения.

Вы уверены, что класс интерфейса ItemReader доступен и у вас есть доступные реализации? Это то, что предлагает сообщение об ошибке (и что я могу получить, если я добавлю имя фиктивного класса в мою контрольную точку). Может быть, попробуйте войти / печать

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

и аналогично для ожидаемого класса реализации?

...