В этом примере я использую aspjectj обернуть методы с тегами пользовательской аннотацией применить JPA сделку: github example.
- SBT версия = 0.13.5
- Play версия = 2.2.1
Plugins.sbt
logLevel := Level.Warn
resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/releases/"
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.2.1")
// Used to weave Logger calls in Controllers and service
addSbtPlugin("com.typesafe.sbt" % "sbt-aspectj" % "0.9.4")
build.scala
import com.typesafe.sbt.SbtAspectj.AspectjKeys.inputs
import com.typesafe.sbt.SbtAspectj._
import sbt.Keys._
import sbt._
object Build extends Build {
val appName = "Interceptor"
val appVersion = "1.0-SNAPSHOT"
val main = play.Project(appName, appVersion)
.settings(aspectjSettings: _*)
.settings(inputs in Aspectj <+= compiledClasses,
products in Compile <<= products in Aspectj,
products in Runtime <<= products in Compile)
}
аннотаций
package service;
/**
* @author z.benrhouma
* @since 09/09/2014
*/
public @interface STransaction {
}
аспект сделки:
package aspects;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import play.db.jpa.JPA;
import play.libs.F;
/**
* @author z.benrhouma
* @since 29/03/2014
*/
@Aspect
public class TransactionAspect {
@Around("execution(* service.*.*(..)) && @annotation(service.STransaction)")
public Object logAccessRules(final ProceedingJoinPoint thisJoinPoint) throws Throwable {
JPA.withTransaction(new F.Callback0() {
@Override
public void invoke() throws Throwable {
thisJoinPoint.proceed();
}
});
return null;
}
}
пример:
package service;
/**
* @author z.benrhouma
* @since 09/09/2014
*/
public class TransactionService {
@STransaction // --> this method will be wrapped with JPA.withTransaction
public static void doSomeProcessing(){
System.out.println("hello with transaction");
}
public static void doSomeProcessing2(){
System.out.println("hello without transaction");
}
}
@Transactional могут быть использованы только в методах действий. –
вы можете добавить пользовательский обработчик аннотации и обернуть транзакционный код. –