JoinPoint для соответствия методам EntityManager - PullRequest
0 голосов
/ 04 мая 2018

Я пытаюсь перехватить вызовы метода 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. Можете ли вы подсказать, что я здесь делаю не так?

выход:

до того, как они найдут вызов: выполнение (Метамодель javax.persistence.EntityManager.getMetamodel ()) после того, как они найдут совет называется: казнь (метамодель javax.persistence.EntityManager.getMetamodel ())

1 Ответ

0 голосов
/ 05 мая 2018

В руководстве Spring AOP указано, что Spring AOP работает только для компонентов / компонентов Spring .

В том же руководстве также описывается, как вы можете применить AOP к классам, отличным от Spring, через полный AspectJ через LTW (ткачество во время загрузки) . Это довольно легко настроить.

Если у вас возникли проблемы с добавлением базового класса из пакета javax..*, поскольку, возможно, класс загружается до активации LTW (даже если вы сможете это сделать, если используете javaagent:/path/to/aspectjweaver.jar), вы все равно можете это сделать. переключиться с execution() на call() pointcut. Пока вызовы находятся в вашем собственном коде приложения, их легко перехватить через AspectJ. Но для этого вам нужен AspectJ, а не Spring AOP, поскольку последний не поддерживает bean-компоненты не-Spring (как упомянуто выше) или pointcut call() (как упомянуто в руководстве Spring ).


Обновление после комментария ОП:

Я только что проверил EntityManager Javadoc для вас: метод getMetaModel() является частью интерфейса, а get() - нет. Следовательно, pointcut не может его найти.

...