Выражение pointcut не соответствует методу Spring Data, несмотря на указание точного имени в выражении - PullRequest
0 голосов
/ 20 ноября 2018

В моем проекте Spring Boot у меня есть AddressRepository, который приносит все адреса из базы данных.У меня есть класс Aspect и выражение pointcut, которое выполняется после вызова метода findAll().Когда я выполняю свой тестовый пример, Совет не запускается, и другие методы, такие как findAll(Sort sort), findAll(Pageable pageable), работают просто отлично.Я не уверен, что это ошибка Spring Boot или мое выражение.Я пытался использовать Spring Boot 2.0.5 и 2.1.0, но, похоже, ничего не решило мою проблему

AddressLogging.java

@Aspect
@Configuration
public class AddressLogging {
    private Logger log=LoggerFactory.getLogger(AddressLogging.class);

    //@Pointcut("execution(* com.springtesting.repo.AddressRepository.*(..))")
    @Pointcut("execution(* com.springtesting.repo.AddressRepository.findAll())")
    public void getAddresses() {}

    @After("getAddresses()")
    public void afterAdvice() {
        log.error("Log Message: Inside afterAdvice() advice");
    }
}

AopTest.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class AopTest {
    @Autowired
    private AddressRepository addressRepository;

    @Test
    public void getAddresses() {
        //addressRepository.findAll(PageRequest.of(0,20, Sort.by("id")));
        addressRepository.findAll();
    }

    @Test
    public void findAddressById() {
        addressRepository.findById(1L);
    }
}

AddressRepository

public interface AddressRepository extends JpaRepository<Address,Long> {}

1 Ответ

0 голосов
/ 11 декабря 2018

Аспект Spring AOP также должен быть @Component и выбираться при сканировании компонента.Я понятия не имею, почему вместо этого вы добавили @Configuration к аспекту, потому что здесь нет конфигурации.

Возможно, ваш тест отдельного класса конфигурации должен содержать аннотацию @Configuration, и вам также следует активировать что-то вроде @EnableAspectJAutoProxy(proxyTargetClass = true) и @ComponentScan(basePackages = { "de.scrum_master" }).

Вот фрагмент из одного из моих проектов Spring AOP для игровых площадок (я его почти не использую, я не использую Spring AOP или даже сам Spring, обычно я использую более мощный AspectJ).:

package de.scrum_master.app;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;

@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
@ComponentScan(basePackages = { "de.scrum_master" })
public class Application2 {
  public static void main(String[] args) throws Exception {
    ApplicationContext appContext = new AnnotationConfigApplicationContext(Application2.class);
    B b = (B) appContext.getBean("b");
    System.out.println(b.getData("bbb"));
    A a = (A) appContext.getBean("b");
    System.out.println(a.getData("aaa"));
  }
}
...