Можно ли добавить совет на основе AspectJ к пружинным методам репозитория остатков данных CrudRepository? - PullRequest
0 голосов
/ 21 января 2019

Я использую spring-boot 2.0.5 в сочетании с spring-data-rest.Я хотел бы добавить совет на основе AspectJ к некоторым стандартным методам CrudRepository, использующим Spring-data-rest, таким как find, findAll и save.

Независимо от того, как я определяю точки, совет никогда не применяется.

Я использую LoadTimeWeaving (LTW), который, вообще говоря, кажется, работает.

Может кто-то пролить свет на то, почему это может иметь место?Можно ли вообще заменить spring-aop на AOP на основе AspectJ?

Я прочитал документацию Spring для AOP (AspectJ и spring-aop), а также инструкции по использованию AspectJ в сочетании с spring-AOP, что я мог найти с помощью Google.Все примеры, которые я мог найти, говорят о добавлении рекомендаций на основе AspectJ к методам сущностей, но не к методам репозитория spring-data-rest.

Я также мог бы найти здесь один очень похожий вопрос по stackoverflow ( AspectJ pointcut onметод в Spring CrudRepository ).Но на этот вопрос никогда не было ответа.Вместо этого автор предоставил обходной путь для своей конкретной проблемы.И этот обходной путь не применим к моим требованиям.

Одно из моих определений точек в ApsectJ в "PointCuts.aj":

public pointcut repositoryFindMethods(): execution(* *..CrudRepository+.find*(..));

Этот pointcut должен соответствовать всем методам внутри любого интерфейса / классанаследуется от CrudRepository из spring-data-rest, имя метода которого начинается с «find» и имеет любое количество параметров.

Рекомендации, основанные на этом определении pointcut, никогда не применяются / не выполняются, например:

Object around() : PointCuts.repositoryFindMethods()  { .... }

никогда не будет вызываться.

Однако, совет будет применяться, как и ожидалось, если я использую spring-aop для реализации и указываю pointcut как:

@Pointcut("execution(* *..CrudRepository+.find*(..))")
public void repositoryFindMethods() {}

в "PointCuts.java""и реализовать рекомендации, используя стиль spring-aop:

@Around("PointCuts.repositoryFindMethods()")
public Object aroundRepositoryFindMethods(ProceedingJoinPoint proceedingJoinPoint) { ... }

Поскольку мне требуется, чтобы ApsectJ реализовывал рекомендации в другом месте кода, я хотел бы реализовать рекомендации для методов Spring-data-rest CrudRepository, основанных наAspectJ тоже.

...