如何将jcabi-aspects与Play框架一起使用



我在Play!应用程序中找不到任何jcabi方面的例子。

这是我Build.scala文件

import sbt._
import Keys._
import play.Project._
object ApplicationBuild extends Build {
  val appName         = "test-for-fun"
  val appVersion      = "1.0-SNAPSHOT"
  val appDependencies = Seq(
    // Add your project dependencies here,
    "com.jcabi" % "jcabi-aspects" % "1.0-SNAPSHOT",
    "org.aspectj" % "aspectjrt" % "1.6.12" % "runtime",
    javaCore,
    javaJdbc,
    javaEbean
  )
  val main = play.Project(appName, appVersion, appDependencies).settings(
    resolvers += "oss.sonatype.org" at "https://oss.sonatype.org/content/repositories/snapshots/" 
  )
}

这就是我如何称呼@Loggable

package controllers;
import play.*;
import play.mvc.*;
import com.jcabi.aspects.Loggable;
import views.html.*;
public class Application extends Controller {
    @Loggable(Loggable.INFO)
    public static Result index() {
        return ok(index.render("Your new application is ready."));
    }
}

如果您可以提供任何提示,欢迎您。

我的主要目标是使用 AOP 执行日志记录,因此,如果您知道使用 Play!

谢谢

我今天实际上正在研究同样的事情,并让它与我的 scala 项目一起工作(它使用 SBT,尽管我一直在通过 intellij 运行东西)。我认为你将不得不做几件事:

  1. 正如这里提到的,你需要添加一个 -javaagent:~/path-to/aspectjweaver.jar 对于你正在运行的任何 java 命令。有关如何为 play 项目添加 javaagent 标志的示例,请参阅此处。

  2. 包括一些额外的依赖项:

    libraryDependencies += "org.aspectj" % "aspectjweaver" % "1.7.2"

    libraryDependencies += "org.aspectj" % "aspectjrt" % "1.7.2"

    libraryDependencies += "com.jcabi" % "jcabi-aspects" % "0.8"

    libraryDependencies += "com.jcabi" % "jcabi-log" % "0.8"

  3. 在项目的资源文件夹中创建一个 META-INF/aop.xml。这就是定义 aspectj 的运行时编织的原因。有关示例,请参阅此要点。

  4. 将 MethodLogger 类从 jcabi-aspects v0.8(和 Mnemos.java 和 NamedThreads.java)复制到您的 com.yourcompany.yourpackage 中。这样做的原因(据我所知)是 jcabi 包是以特殊方式编译的,我们希望改为进行运行时编织,所以这解决了这个问题。编辑:也许这是由于我使用 Java 7 和用 Java 6 编译的插件 - 我在 SBT 中构建时看到一些警告。

我很高兴听到是否有更好的方法,但这至少看起来有效。

最新更新