Могут ли выражения pointcut соответствовать параметру generi c в методах Java? - PullRequest
1 голос
/ 28 января 2020

Моя проблема в том, что мое выражение 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) {
}

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

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

Ответы [ 2 ]

0 голосов
/ 28 января 2020

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

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

Так попробуйте это:

public <T> ResponseEntity<T> doSomeAction(String a, Class<?> b, Object c, String d, String e) {
}
0 голосов
/ 28 января 2020

Согласно весенней документации, 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))
...