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 не может его найти.

Другие вопросы по тегам