用于匹配 EntityManager 方法的 JoinPoint



我正在尝试拦截对实体管理器查找方法的调用。

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之前找到调用:执行(元模型) javax.persistence.EntityManager.getMetamodel()) after em find advice 调用:执行(元模型) javax.persistence.EntityManager.getMetamodel())

Spring AOP手册指出 Spring AOP 仅适用于 Spring bean/组件。

同一手册还描述了如何通过LTW(加载时编织)通过完整的AspectJ将AOP应用于非弹簧类。它很容易配置。

如果您在从javax..*包编织到基本类时遇到任何问题,因为该类可能在激活 LTW 之前加载(即使您使用javaagent:/path/to/aspectjweaver.jar应该能够做到这一点),您仍然可以从execution()切换到call()切入点。只要调用在您自己的应用程序代码中,就应该很容易通过 AspectJ 进行拦截。但是你确实需要 AspectJ,而不是 Spring AOP,因为后者既不支持非 Spring bean(如上所述),也不call()切入点(如 Spring 手册中所述)。


OP评论后更新:

我刚刚为您检查了 JavadocEntityManager:方法getMetaModel()是接口的一部分,而get()不是。因此,切入点找不到它。

相关内容

最新更新