Другим вариантом, который также довольно популярен, является Java Service Wrapper . Это также довольно популярно в сообществе OSS.
Это помогло мне. Я изменил тип возвращаемого значения List на java.util.List.
Как перехватить возвращаемый тип List с помощью выражения точечного вырезания AOP
@Aspect
@Component
public class MyItemDaoLoggingAspect {
//this is wher we add all aspect logic
//@Before advice
@Before("execution(public java.util.List getAllItems())")
public void beforeVaalidateMyItem() {
System.out.println(" ========> In MyItemDaoLoggingAspect");
System.out.println(" ========> Executing beforeAscpect for validateMyItem");
}
}
Эта строка вызывает проблему: @Before ("execute (public List getAllItems ())")
Необходимо удалить модификатор доступа и тип возврата метода, используемого при выполнении, и добавить полное имя класса где этот метод присутствует. см. ниже
@Before («выполнение ( поместите здесь полное имя класса .getAllItems ())»)
Есть две вещи, которые могут вызвать проблемы в вашем коде.
1.Вы не определили полное имя метода. По крайней мере, требуется подстановочный знак.
2.Вы указали модификатор доступа в вашем pointcut как public , а для механизма прокси вы использовали proxy-target-class="true"
, который заставляет Spring использовать механизм прокси CGLIB. Но согласно " https: / /tenmilesquare.com/using-gclib-with-proxy-target-class-true/ "CGLIB не будет использовать прокси любого публичного метода.
Так что я бы предложил изменить ваш pointcut следующим образом.
"execution(* packageName.*.getAllItems(..))"
или попробуйте с полным именем метода в pointcut вместе с proxy-target-class="false"
Для получения более подробной информации о подписи pointcut см. Пункт 7.2.3.4 на https : //docs.spring.io/spring/docs/3.0.0.M4/reference/html/ch07s02.html