JoinPoint匹配EntityManager方法

时间:2018-05-04 12:15:42

标签: spring spring-aop entitymanager

我正在尝试拦截对 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())

1 个答案:

答案 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>。因此,切入点无法找到它。