我在我的Scala项目中使用带有sbt-aspectj的AeyJ库。我正在尝试使用if()
表达式编写@PointCut
:
@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教程介绍:
因此,通过注释样式,可以仅在@pointcut表达式中使用if()切入点。if()不能包含任何正文。然后,带注释的@切入点方法必须是公共静态布尔的形式,并且可以像往常一样使用形式绑定
可以在Scala方法上使用切入点中的if()表达式吗?
请注意,tracePerfPc()的方法签名是
def tracePerfPc(jp: ProceedingJoinPoint): Boolean
或更完整
def tracePerfPc(jp: ProceedingJoinPoint): scala.Boolean
scala中的类型Boolean(或scala.Boolean)与Java Boolean不同,Java Boolean是一种基本类型,没有对象。
因此,您不能在AeyJ中使用
if()
和返回值,因为原生scala中不存在原始类型boolean
。
我使用的是Spring security 3.2.0和Spring框架的相同版本。Spring security在我的项目中工作得很好。为了保护DAO类(和其他类)中的方法,我希望使用以下切入点方法(在文件中)。 我希望指定的pointcut表达式能够保护包内所有类中的所有方法,并且只能由具有指定权限的用户访问。
我在@controllerAdvice中定义了一个@ModelAttribute(键),我在多个控制器方法中使用相同的模型属性作为方法参数,因为(键)在所有控制器中都可用。 我像这样在控制器类中添加属性(key)。 我想截取所有以作为方法参数的控制器方法。 我的方面文件看起来像这样。 但是我的服务器启动失败说 [tomcat:launch]由:java引起。lang.IllegalArgument
我有一个场景,我需要拦截一些子类方法,但我找不到合适的切入点表达式来这样做。 我有一个面向客户机的接口,它有一个方法。 当用户调用方法时,我希望截获方法。我可以很容易地截获,但是似乎没有什么能截获子类方法。我甚至尝试使用自定义注释来注释这些信息方法,但没有成功。到目前为止,我提出了以下方面 将设置为true或false也没有帮助。我知道AOP不能拦截私有子类方法,但这些是公共的。有可能做到这一点吗
是否可以根据方法参数名称匹配切入点表达式? 例如,我想将所有方法与作为参数进行匹配。 我无法按数据类型进行匹配,因为它太宽了。 我知道我可以使用通配符匹配任何内容,例如执行(**(..)” 并检查方法体中的参数名称,但这似乎过多?
我从@kriegaex那里得到了一个答案,我无法理解。 我试图理解的切入点表达式如下 据我所知,此表达式将建议使用MyAnnotation注释的任何类或方法 从引用留档中,表达式的格式如下: 基于此格式,以下表达式 可以解释为 建议使用注释的类中的任何方法调用。如果我错了,请纠正我。 对于这个表达式 我无法理解修饰符模式如何可以是MyAnnotation?这是怎么回事?