Точка соединения AspectJ в репозитории Spring

Я пытаюсь перехватить вызовы моего метода Repository.save. В основном это объясняется здесь и Здесь. Единственная проблема в том, что это просто не работает. Я явно что-то упускаю, но через много часов я не понимаю, что именно.

Я использую Spring 4.1.6 и AspectJ 1.8.5.

Код:

Интересные аннотации из моего класса конфигурации:

@Configuration
@EnableWebMvc
@EnableAspectJAutoProxy
@EnableJpaRepositories(
   basePackageClasses=com.xxx.admin.repository.ComponentScan.class)
@ComponentScan(basePackageClasses=      
   {com.xxx.admin.domain.ComponentScan.class
    ,com.xxx.admin.model.ComponentScan.class
    ,com.xxx.admin.service.ComponentScan.class})
@EnableTransactionManagement
@EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED )`

Целевой репозиторий:

@Repository
public interface UserRepository extends PagingAndSortingRepository<User, UserId> {

@Transactional(readOnly=true)
Page<User> findAll(Pageable pageable);

@SuppressWarnings("unchecked")
@Transactional
public User save(User user);
}

Аспект:

@Aspect
public class RepositorySaveAspect {

// Define the JoinPonit
//"org.springframework.data.repository.Repository+.*(..))")
//com.xxx.admin.repository.

//@Pointcut("execution(* com.xxxx.admin.repository.UserRepository.save(..))")
//@Pointcut("execution(* com.xxxx.admin.repository.*Repository+.*(..))")
//@Pointcut("execution(* org.springframework.data.repository.PagingAndSortingRepository+.*(..))")
@Pointcut("execution(public !void org.springframework.data.repository.CrudRepository+.*(..))")
public void repositorySavePoints() {
}

Как видите, я пробовал несколько разных типов Pointcut. Но ни один из них не работает. Подозреваю, что пропустил что-то, связанное с проксированием. Совет (каламбур) оценен.


person Terry    schedule 28.05.2015    source источник
comment
Вы решили эту проблему? У меня сейчас очень похожая проблема.   -  person Seamus McMorrow    schedule 12.06.2015
comment
Я не. Я создал тестовый проект без spring, только asprxtJ, и pointcut на Interface + работает. Я думаю, это как-то связано с отсутствием реализации в рамках проекта, но это только предположение. И не объясняет, почему связанный пример утверждает, что работает. Это может быть актуальная ошибка в аспектеJ?   -  person Terry    schedule 12.06.2015
comment
1) Я не думаю, что вам понадобится @EnableLoadTimeWeaving в этом случае (не с текущей версией Spring). 2) Попробуйте аннотировать свой RepositorySaveAspect с помощью @Component 3) У меня работает pointcut @Pointcut("execution(* org.springframework.data.repository.*.save(..)) && args(entity)") public void repoSave(Object entity) {}   -  person Michal    schedule 21.03.2017