вот совет
@AfterReturning(
pointcut = "execution(public java.util.List<me.mikholskiy.domains.Customer> me.mikholskiy.daos.CustomerDao.getAll())",
returning = "resultList")
public void adviceBeforeGetAllCustomersFromDatabase(JoinPoint joinPoint,
List<Customer> resultList) {
// ...
}
Поэтому, когда я использую эту аннотацию совета без параметра returning
, она работает, как и ожидалось. Но когда я хочу связать возвращаемый результат с этим советом, ничего не происходит. Он даже не выполняется.
Вот целевой метод для этого совета:
@Override
public List<Customer> getAll() {
return sessionFactory.getCurrentSession()
.createQuery("from Customer", Customer.class)
.list();
}
Я использую эти зависимости
org.springframework:spring-webmvc:5.3.17
org.springframework:spring-aspects:5.3.17
org.aspectj:aspectjweaver:1.9.7
Невозможно сопоставить тип List<Customer>
, поскольку предложение returning
также ограничивает сопоставление относится только к тем выполнениям метода, которые возвращают значение указанного типа (Object
или в данном случае его подтипы, которые будут соответствовать любому возвращаемому значению).
Итак, в вашем коде вместо:
public void adviceBeforeGetAllCustomersFromDatabase(
JoinPoint joinPoint, List<Customer> resultList) {
...
Попробуйте с:
public void adviceBeforeGetAllCustomersFromDatabase(
JoinPoint joinPoint, Object resultList) {
...
Это также будет работать с List<?>
Да, на самом деле он будет работать с List<Customer>
, если он может совпадать, но это не так, вам нужно его отладить.
Это не нужно и перебор. У меня пример работает так, как показано в вопросе, ничего менять не нужно. И если вы хотите сделать pointcut более общим, используйте общие List
s в pointcut и/или параметре метода. Но, как я уже сказал, это работает именно так, как показано здесь. Использование Object
не обязательно. Я даже использую более старые версии Spring WebMVC и Spring AOP (обе 5.3.12, импортированные Boot 2.5.6) в своем проекте игровой площадки. Даже если я обновлюсь до последней версии Boot 2.6.4, а библиотеки будут обновлены до 5.3.16, он все равно будет работать.
Так что, несмотря на то, что это принято, это нет решение, это всего лишь плохой обходной путь. @toiapp, пожалуйста, поделитесь MCVE на GitHub и позвольте мне найти настоящую основную причину. Вероятно, что-то отличается от того, что вы нам здесь показали, или не хватает какой-то информации. Возможно, у вас есть опечатка в pointcut и реальное имя пакета отличается от имени в pointcut или что-то в этом роде. Но это должно работать без использования Object
.
Не могли бы вы попробовать заменить
List<Customer> resultList
наObject resultList
?