Scala + AspectJ: if() выражения pointcut

Я использую библиотеку AspectJ с sbt-aspectj в моем проекте Scala. Я пытаюсь написать @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 
...

В следующем руководстве AspectJ сказано:

Таким образом, с помощью стиля аннотации можно использовать указатель if() только внутри выражения @Pointcut. If () не должен содержать тела. Затем аннотированный метод @Pointcut должен иметь форму public static boolean и может использовать формальные привязки как обычно

Можно ли использовать if() выражение в @Pointcut по методам Scala?

1 ответ

Решение

Обратите внимание, что ваш метод подписи для tracePerfPc() является

def tracePerfPc(jp: ProceedingJoinPoint): Boolean

или более полный

def tracePerfPc(jp: ProceedingJoinPoint): scala.Boolean

Тип Boolean (или же scala.Boolean) в Scala не то же самое, что Java boolean который является примитивным типом и без объекта.

Таким образом, вы не можете использовать if() в AspectJ вместе с возвращаемым значением в качестве примитивного типа boolean не существует в родной скале.

Другие вопросы по тегам