playframework-2.0 - AspectJ 加载但忽略 Play Framework 2.2.x 中的类

标签 playframework-2.0 aspectj

我无法让我的 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/

相关文章:

Heroku 错误 503,多个域上的 webSocket

java - Play Framework 2.0 如何在 Java 中使用 OpenID?

java - 使用Spring中的Aspects计算方法处理时间

java - 带有@Loggable 注释的方法从不打印方面日志

java - 除了已部署的 WAR,AspectJ CTW 编织在任何地方都有效?

mysql - Play +光滑 : How to do partial model updates?

java - play framework 2.1 junit 测试无法从 eclipse 运行

Java 玩!框架开发

java - 当从特定类调用某个方法时执行 AOP

java - 如何在 JPA 域模型中实现状态设计模式