Scala + AspectJ:if()切入点表达式

问题描述 投票:1回答:1

我在我的Scala项目中使用带有sbt-aspectj的AspectJ库。我正在尝试用@Pointcut表达式编写if()

@Aspect
object PerformanceTracer extends Logger {

  @Pointcut("@annotation(PerformanceTracing) && execution(* *(..)) && if()")
  def tracePerfPc(jp: ProceedingJoinPoint): Boolean = {
    // some logic
  }

  @Around("tracePerfPc(jp)")
  def tracePerformance(jp: ProceedingJoinPoint): Object = {
    val start = System.currentTimeMillis
    log.debug("{}: start proceeding", jp.toShortString)
    val res = jp.proceed
    val duration = System.currentTimeMillis - start
    log.info("[{} ms] {}: end proceeding. Duration: {} ms.", duration, jp.toShortString, duration)
    res
  }
}

但我有以下例外:

[warn] warning at <Unknown>::0 Found @Pointcut on a method not returning 'void' or not 'public static boolean'
[error] error at <Unknown>::0 Cannot read debug info for @Aspect to handle formal binding in pointcuts (please compile with 'javac -g' or '<javac debug='true'.../>' in Ant)
[error] org.aspectj.bridge.AbortException: AspectJ failed
[error]         at com.lightbend.sbt.SbtAspectj$Ajc$.runAjcMain(SbtAspectj.scala:212)
[error]         at com.lightbend.sbt.SbtAspectj$Ajc$.runAjc(SbtAspectj.scala:124)
[error]         at 
...

following AspectJ tutorial说:

因此,注释样式可以仅在@Pointcut表达式中使用if()切入点。 if()不能包含任何正文。带注释的@Pointcut方法必须是public static boolean形式,并且可以像往常一样使用正式绑定

是否有可能在if()中使用@Pointcut表达式Scala方法?

scala aop aspectj sbt-aspectj
1个回答
2
投票

请注意,tracePerfPc()的方法签名是

def tracePerfPc(jp: ProceedingJoinPoint): Boolean

或更完整

def tracePerfPc(jp: ProceedingJoinPoint): scala.Boolean

scala中的Boolean(或scala.Boolean)类型与Java boolean不同,后者是原始类型且没有对象。

所以你不能在AspectJ中使用if()和返回值,因为原始类型boolean在本地scala中不存在。

© www.soinside.com 2019 - 2024. All rights reserved.