私たちには、Springトランザクション管理を使用する、JavaとScalaの混合プロジェクトがあります。 @Transactionalアノテートされたメソッドでファイルを織り込むために、Springのアスペクトを使用しています。ScalaでSpring @Transactionalを使用する
問題は、ScalaクラスがSpringのトランザクションの側面に織り込まれていないことです。 Scalaでトランザクションを考慮してSpringを設定するにはどうすればよいですか?
私たちには、Springトランザクション管理を使用する、JavaとScalaの混合プロジェクトがあります。 @Transactionalアノテートされたメソッドでファイルを織り込むために、Springのアスペクトを使用しています。ScalaでSpring @Transactionalを使用する
問題は、ScalaクラスがSpringのトランザクションの側面に織り込まれていないことです。 Scalaでトランザクションを考慮してSpringを設定するにはどうすればよいですか?
Springでは、Spring管理Beanから始めるためにトランザクション境界が必要です。したがって、@Transactional
Scalaクラスは排除されます。
単純な解決策は、@Transactional
のサービスファサードを作ることです。JavaクラスはSpring Beanとしてインスタンス化されます。これらは、Scalaサービス/コアコードに委任することができます。
手動でトランザクションを作成するEberhard Wolffのクロージャを使用するのは、Scala専用のソリューションです。使用法:
transactional() {
// do stuff in transaction
}
はここで見つける:http://www.slideshare.net/ewolff/scala-and-spring(スライド41)
ライセンス:Apacheの
スカラ座やお春の@Transactional
サポートに関する特別なものは何もありません
Javaコードなしでも使用できます。あなたが豆のための "純粋な"特性を持っていることを確認してください。実装は@Transactional
注釈を使用します。また、PlatformTransactionManager
タイプのBeanを宣言する必要があります(.xmlベースのSpring構成を使用している場合は、Bean名に「transactionManager」を使用する必要があります。詳細はEnableTransactionManagement's JavaDocを参照してください)。また、アノテーションベースのコンフィグレーションクラスを使用している場合は、これらのクラスが専用のファイルに配置されていることを確認してください。つまり、他のクラス(コンパニオンオブジェクトはOK)を同じファイルに配置しないでください。ここでは簡単な作業例です:
SomeService.scala:
trait SomeService {
def someMethod()
}
// it is safe to place impl in the same file, but still avoid doing it
class SomeServiceImpl extends SomeService {
@Transactional
def someMethod() {
// method body will be executed in transactional context
}
}
AppConfiguration.scala:
@Configuration
@EnableTransactionManagement
class AppConfiguration {
@Bean
def transactionManager(): PlatformTransactionManager = {
// bean with PlatformTransactionManager type is required
}
@Bean
def someService(): SomeService = {
// someService bean will be proxied with transaction support
new SomeServiceImpl
}
}
// companion object is OK here
object AppConfiguration {
// maybe some helper methods
}
// but DO NOT place any other trait/class/object in this file, otherwise Spring will behave incorrectly!
一つの簡単な解決策(回避策)がJavaインタフェースに注釈を入れて、あなたを作ることができScalaクラスはこれらのインタフェースを実装します。 –
Spring Aspectを使用してトランザクションを組み立てる場合、これは不可能です。注釈がインタフェースにある場合、トランザクションは開始されません。 – timomeinen