Контроллер лога с AspectJ - PullRequest
0 голосов
/ 01 мая 2019

У меня есть загрузочное приложение Spring, и я хочу записать некоторую информацию о том, что происходит при вызове идентификатора метода Controller.

Почему-то мой Аспект не работает.

Вот мой класс @Component с аннотацией @Aspect:

@Pointcut("within(@org.springframework.stereotype.Controller *)")
public void controller() {
}

@Pointcut("execution(* *.*(..))")
protected void allMethod() {
}

@Before("controller()&& allMethod()")
public void logBefore(JoinPoint joinPoint) {
}

Метод logBefore не вызывается, когда любой метод Controller вызывается с REST.

Ответы [ 2 ]

2 голосов
/ 02 мая 2019

Важно. Поскольку вы заявили, что используете установку Spring Boot, я предполагаю, что вы реализовали модуль Spring AOP вместо «фактической» библиотеки AspectJ. Разница значительна, так как реализация АОП отличается между ними. Spring использует аннотации AspectJ для применения прокси , в то время как AspectJ «вплетает» код в ваше приложение. Короче говоря, Spring AOP может быть проще реализовать, в то время как AspectJ предлагает более тонкую функциональность (например, ткачество во время компиляции). Сравнение можно найти здесь .

Я опробовал конфигурацию из фрагмента кода, который вы указали в своем посте. Совет был вызван после того, как я добавил несколько аннотаций:

@SpringBootApplication
// Be sure to add EnableAspectJAutoProxy and set proxyTargetClass to true
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class DemoApplication {
  ...
}
// Be sure to add @Aspect and @Component
@Component
@Aspect
public class DemoAop {

  private static Logger logger = LoggerFactory.getLogger(DemoAop.class);

  @Pointcut("within(@org.springframework.stereotype.Controller *)")
  public void controller() {
  }

  @Pointcut("execution(* *.*(..))")
  protected void allMethod() {
  }

  @Before("controller()&& allMethod()")
  public void logBefore(JoinPoint joinPoint) {
    logger.info("TEST");
  }

}

1 голос
/ 02 мая 2019

Во время выполнения ваш контроллер аннотируется @RestController, но не @ Controller.

Работает простое изменение Pointcut на RestController:

 @Pointcut("within(@org.springframework.web.bind.annotation.RestController *)")
 public void controller() {
 }
...