Как использовать jcabi-аспекты с платформой Play

Я не могу найти ни одного примера jcabi-аспектов в Play! приложение.

Вот мой 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! пожалуйста.

Спасибо

1 ответ

Решение

I was actually looking into the same thing today and got it working with my scala project (which uses SBT, though I've been running stuff through intellij). I think you're going to have to do a few things:

  1. Как упомянуто здесь, вы захотите добавить -javaagent:~/path-to/aspectjweaver.jar для любой команды java, которую вы запускаете. Смотрите здесь пример того, как добавить флаг javaagent для проекта воспроизведения.

  2. Включите некоторые дополнительные зависимости:

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

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

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

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

  3. Создайте META-INF/aop.xml в своей папке ресурсов для своего проекта. Это то, что определяет время выполнения для аспекта j. Посмотрите эту суть для примера.

  4. Скопируйте класс MethodLogger из jcabi-aspect v0.8 (и Mnemos.java и NamedThreads.java) в ваш com.yourcompany.yourpackage. Причина этого (насколько я могу судить) заключается в том, что пакеты jcabi компилируются особым образом, и мы вместо этого хотим выполнять ткачество во время выполнения, так что это обходит это. Редактировать: возможно, это из-за того, что я использую Java 7 и плагины компилируются в Java 6- я вижу некоторые предупреждения при сборке в SBT.

Я был бы рад услышать, если у кого-то есть лучший способ, но это, по крайней мере, кажется, работает.

Другие вопросы по тегам