2

我想实现记录使用某些注释(例如:)注释的某些方法的进入和退出的能力@Loggable。我遇到了 AspectJ AOP,我们可以使用它来做到这一点。

我实现了自己的自定义方面来自定义要在调用的方法的进入和退出时打印的日志消息@Loggable

@Aspect
public final class MethodLogger {

  private static final Logger LOG = LoggerFactory.getLogger(MethodLogger.class);

  @Around("execution(* *(..)) && @annotation(Loggable)")
  public Object around(ProceedingJoinPoint point) throws Throwable {

    String className = MethodSignature.class.cast(point.getSignature()).getClass().getName();
    String methodName = MethodSignature.class.cast(point.getSignature()).getMethod().getName();
    LOG.info(
        "Entering method:{}() of class:{} with parameters: {}",
        methodName,
        className,
        Arrays.toString(point.getArgs()));

    try
    {
      return point.proceed();
    }
    catch(Throwable e){
       throw e;
    }
    finally
    {
      LOG.info(
          "Exiting method:{}() of class:{} with parameters: {}",
          methodName,
          className,
          Arrays.toString(point.getArgs()));
    }

  }
}

pom.xml 依赖项:

<dependency>
      <groupId>com.jcabi</groupId>
      <artifactId>jcabi-aspects</artifactId>
      <version>0.22.5</version>
    </dependency>
    <dependency>
      <groupId>org.aspectj</groupId>
      <artifactId>aspectjrt</artifactId>
      <version>1.9.1</version>
    </dependency>

具有用 注释的方法的类@Loggable

@Component
public class LoginPage extends BasePage {

@Loggable
public Object login(String username, String password) {

}

}

问题

当这个实例方法(login())主要以以下方式调用时: loginPage.login(),我看不到正在打印到日志输出的进入和退出日志。

请注意:

  • 我正在使用 Spring 依赖注入来初始化带有@Component注释的类,不确定这是否对论坛有用,但仍然让大家知道。
  • 这是一个测试自动化项目,我从 JUnit+Cucumber 运行器类触发一些 UI 自动化测试。
  • 我没有从 Maven 触发我的测试。

有人可以建议这里可能出了什么问题吗?

4

1 回答 1

1

您的方面MethodLogger尚未初始化。尝试添加@ComponentMethodLogger. 这应该将方面加载并注册到上下文中,使其准备好使用。

此外,您可能想简化您的切入点@Around("execution(* *(..)) && @annotation(Loggable)")

execution(* *(..))基本上是一张通配符,因此没用。只需使用@Around("@annotation(Loggable)").

于 2018-07-16T14:24:42.687 回答