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
не существует в родной скале.