Могут ли выражения pointcut соответствовать общему параметру в методах Java?

Моя проблема в том, что мое выражение pointcut кажется не соответствует вызову метода и поэтому не выполняется. Я подозреваю, что это связано с дженериками в списке параметров.

Метод, который я пытаюсь сопоставить, имеет следующую подпись (фактические имена запутаны):

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) {
}

Используемое выражение pointcut:

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

Немного поиска, я нашел что-то связанное , но я не могу сказать, что понимаю это.

Кто-нибудь может пролить свет на это?


person mymirs    schedule 28.01.2020    source источник
comment
Добро пожаловать в СО. Ваши фрагменты не содержат достаточно информации, чтобы ответить на вопрос. Мне нужно увидеть полные классы с именами пакетов, импортом, полным аспектом. Пожалуйста, узнайте, что такое MCVE и как задавать хорошие вопросы, а затем отредактируйте свой вопрос и сообщите мне об этом в комментарии.   -  person kriegaex    schedule 28.01.2020
comment
Метод с данной сигнатурой может быть рекомендован при условии, что выражение точечного разреза допустимо. Тот, который предоставлен с вопросом, неверен / недействителен. Поделитесь полным примером или соответствующими классами (конфигурация, класс аспекта, класс с методом перехвата), чтобы мы могли помочь   -  person R.G    schedule 28.01.2020


Ответы (2)


Согласно документации 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))
person lazylead    schedule 28.01.2020

Вы не можете сопоставлять на основе общего аргумента, как указано в справочной документации Spring Framework (Collection<T> используется в качестве примера, но похоже, что это влияет на все дженерики). Spring рекомендует сделать следующее:

Чтобы добиться чего-то подобного, вам нужно ввести параметр Collection<?> и вручную проверить тип элементов.

Итак, попробуйте следующее:

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