Совет @Afterreturning от Spring AOP не работает, когда я привязываю к нему возвращаемый результат

вот совет

@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> resultList на Object resultList?

İsmail Y. 19.03.2022 11:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Невозможно сопоставить тип List<Customer>, поскольку предложение returning также ограничивает сопоставление относится только к тем выполнениям метода, которые возвращают значение указанного типа (Object или в данном случае его подтипы, которые будут соответствовать любому возвращаемому значению).

Итак, в вашем коде вместо:

public void adviceBeforeGetAllCustomersFromDatabase(
    JoinPoint joinPoint, List<Customer> resultList) {
...

Попробуйте с:

public void adviceBeforeGetAllCustomersFromDatabase(
    JoinPoint joinPoint, Object resultList) {
...

Это также будет работать с List<?>

toiepp 19.03.2022 13:18

Да, на самом деле он будет работать с List<Customer>, если он может совпадать, но это не так, вам нужно его отладить.

İsmail Y. 19.03.2022 13:21

Это не нужно и перебор. У меня пример работает так, как показано в вопросе, ничего менять не нужно. И если вы хотите сделать pointcut более общим, используйте общие Lists в pointcut и/или параметре метода. Но, как я уже сказал, это работает именно так, как показано здесь. Использование Object не обязательно. Я даже использую более старые версии Spring WebMVC и Spring AOP (обе 5.3.12, импортированные Boot 2.5.6) в своем проекте игровой площадки. Даже если я обновлюсь до последней версии Boot 2.6.4, а библиотеки будут обновлены до 5.3.16, он все равно будет работать.

kriegaex 19.03.2022 16:09

Так что, несмотря на то, что это принято, это нет решение, это всего лишь плохой обходной путь. @toiapp, пожалуйста, поделитесь MCVE на GitHub и позвольте мне найти настоящую основную причину. Вероятно, что-то отличается от того, что вы нам здесь показали, или не хватает какой-то информации. Возможно, у вас есть опечатка в pointcut и реальное имя пакета отличается от имени в pointcut или что-то в этом роде. Но это должно работать без использования Object.

kriegaex 19.03.2022 16:12

Другие вопросы по теме