我无法让我的 AspectJ 方面在 Play 2.2.2 框架中工作。这似乎也是其他人试图解决的问题(参见 here ),但到目前为止我没有成功找到答案。 这就是我想要做的:
我有一个 play java 应用程序,我正在尝试为方法进入和方法离开跟踪构建一个 @Trace 注释。所以基本上,我想要一个用 @Trace 注释的方法来记录它的名称和输入参数,并在退出时记录结果。我认为使用 AspectJ 的 AOP 将是一种优雅的方式来做到这一点,以避免不得不用 log.debug(...) 调用使我的代码困惑。
这是我想出的方面:
@Aspect
public class LoggingAspect {
private static Logger log = LoggerFactory.getLogger(LoggingAspect.class);
@Pointcut("@annotation(trace)")
public void methodAnnotatedWithTrace(Trace trace) {}
@Before("methodAnnotatedWithTrace(trace)")
public void traceBefore(JoinPoint joinPoint, Trace trace) {
log.debug("Entering - {} ", joinPoint.getSignature());
}
@AfterReturning("methodAnnotatedWithTrace(trace)")
public void traceAfter(JoinPoint joinPoint, Trace trace) {
log.debug("Exiting - {}", joinPoint.getSignature());
}
}
我在 build.sbt 文件中添加了以下依赖项:
libraryDependencies += "org.aspectj" % "aspectjweaver" % "1.8.1"
libraryDependencies += "org.aspectj" % "aspectjrt" % "1.8.1"
我指定了以下 aop.xml:
<aspectj>
<aspects>
<aspect name="aspects.LoggingAspect"/>
</aspects>
<weaver options="-verbose -XnoInline -showWeaveInfo">
<include within="aspects.*"/>
<include within="controllers.*"/>
</weaver>
</aspectj>
我还将 aspectj 编织器添加到 PLAY_OPTS:
set PLAY_OPTS=-javaagent:C:\\Users\\...\\play-2.2.2\\repository\\cache\\org.aspectj\\aspectjweaver\\jars\\aspectjweaver-1.8.1.jar
然后我用@Trace 注释了我的方法:
@Trace
public Result doSomething(String msg) { ... }
因此,我在运行“Play 测试”时得到以下输出:
[1@2a1ffa9f] info AspectJ Weaver Version 1.8.1 built on Saturday Jun 21, 2014 at 00:07:06 GMT
[1@2a1ffa9f] info register classloader sbt.classpath.ClasspathUtilities$$anon$1@2a1ffa9f
[1@2a1ffa9f] info using configuration /C:/Users/Stephanie/Documents/projects/zeitgenossen/target/scala-2.10/classes/META-INF/aop.xml
[1@2a1ffa9f] info register aspect aspects.LoggingAspect
就是这样。我没有看到痕迹。似乎注释被简单地忽略了。
我错过了什么?
感谢您的帮助!
最佳答案
你的注解@Trace 有运行时保留吗?如果不是,则 AspectJ 在加载时编织时不会在类文件中看到它。
顺便说一句,@annotation(trace)
是非常通用的注解匹配形式,它试图在任何类型的连接点匹配注解,而不仅仅是方法。因此,如果您读取或写入一个带有注释的字段,或者处理一个类型具有该注释的异常——这些都会被匹配。如果您确实调用了带有注释的方法,您将获得运行两次的建议,一次用于方法“调用”,一次用于方法“执行”。您可能应该将匹配限制为您感兴趣的连接点类型:
执行(* *(..)) && @annotation(trace)
现在我想你只是在注释方法,但挖掘注释的成本可能很高,所以如果你将它限制为只查看方法执行连接点,你可以加快这个过程。
关于playframework-2.0 - AspectJ 加载但忽略 Play Framework 2.2.x 中的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25231059/