JoinPoint для соответствия методам EntityManager
Я пытаюсь перехватить вызовы метода find в EntityManager.
public Map<String, String> get() {
Map<String, String> map = new HashMap<>();
DleTestData data = em.find(DleTestData.class, "1");
map.put(data.getId(), data.getName() + " : " + data.getRegion());
return map;
}
У меня есть совет, написанный так:
@Aspect
@Configuration
public class MyAdvice {
@Around("execution(* javax.persistence.EntityManager.*(..))")
public Object aroundFind(ProceedingJoinPoint joinPoint) {
System.err.println("before em find called : " + joinPoint);
Object o = null;
try {
o = joinPoint.proceed();
System.err.println("after em find advice called : " + joinPoint);
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return o;
}
}
Выходные вызовы show перехвачены, но метод find не сопоставляется в pointcut. Можете ли вы подсказать, что я здесь делаю не так?
выход:
до того, как они найдут вызов: выполнение (Metamodel javax.persistence.EntityManager.getMetamodel()) после того, как они найдут совет, вызов: выполнение (Metamodel javax.persistence.EntityManager.getMetamodel())
1 ответ
В руководстве Spring AOP говорится, что Spring AOP работает только для компонентов / компонентов Spring.
В том же руководстве также описывается, как вы можете применить AOP к классам, отличным от Spring, через полный AspectJ через LTW (ткачество во время загрузки). Это довольно легко настроить.
Если у вас возникнут какие-либо проблемы с использованием основного javax..*
пакет, потому что, возможно, класс загружается до активации LTW (даже если вы сможете это сделать, если используете javaagent:/path/to/aspectjweaver.jar
), вы все еще можете переключиться с execution()
в call()
срез точек. Пока вызовы в вашем собственном коде приложения, их легко перехватить через AspectJ. Но для этого вам нужен AspectJ, а не Spring AOP, поскольку последний не поддерживает bean-компоненты не Spring (как упомянуто выше) и call()
pointcut (как упомянуто в руководстве Spring).
Обновление после комментария ОП:
Я только что проверил EntityManager
Javadoc для вас: метод getMetaModel()
является частью интерфейса в то время как get()
не является. Следовательно, pointcut не может его найти.