我正在尝试拦截对 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;
}
}
输出节目调用被拦截,但查找方法在切入点中不匹配。 你能说出我在这里做错了什么吗?
输出:
在em发现之前调用:执行(Metamodel 找到建议之后的javax.persistence.EntityManager.getMetamodel()) 叫:执行(Metamodel javax.persistence.EntityManager.getMetamodel())
答案 0 :(得分:1)
Spring AOP手册指出Spring AOP only works for Spring beans/components。
同一本手册还介绍了如何通过完整AspectJ via LTW (load-time weaving)将AOP应用于非Spring类。这很容易配置。
如果您在javax..*
包中编织基本类时遇到任何问题,因为可能在LTW激活之前加载了类(即使您应该能够在使用javaagent:/path/to/aspectjweaver.jar
时执行此操作) ,您仍然可以从execution()
切换到call()
切入点。只要调用在您自己的应用程序代码中,就很容易通过AspectJ进行拦截。但你确实需要AspectJ,而不是Spring AOP,因为后者既不支持非Spring bean(如上所述)也不支持call()
切入点(如Spring manual中所述)。
OP评论后更新:
我刚刚为您检查了EntityManager
Javadoc:方法getMetaModel()
是界面的一部分,而get()
则不是。<li>
。因此,切入点无法找到它。