2010-12-08 25 views
4

私たちには、Springトランザクション管理を使用する、JavaとScalaの混合プロジェクトがあります。 @Transactionalアノテートされたメソッドでファイルを織り込むために、Springのアスペクトを使用しています。ScalaでSpring @Transactionalを使用する

問題は、ScalaクラスがSpringのトランザクションの側面に織り込まれていないことです。 Scalaでトランザクションを考慮してSpringを設定するにはどうすればよいですか?

+0

一つの簡単な解決策(回避策)がJavaインタフェースに注釈を入れて、あなたを作ることができScalaクラスはこれらのインタフェースを実装します。 –

+0

Spring Aspectを使用してトランザクションを組み立てる場合、これは不可能です。注釈がインタフェースにある場合、トランザクションは開始されません。 – timomeinen

答えて

3

Springでは、Spring管理Beanから始めるためにトランザクション境界が必要です。したがって、@Transactional Scalaクラスは排除されます。

単純な解決策は、@Transactionalのサービスファサードを作ることです。JavaクラスはSpring Beanとしてインスタンス化されます。これらは、Scalaサービス/コアコードに委任することができます。

2

手動でトランザクションを作成するEberhard Wolffのクロージャを使用するのは、Scala専用のソリューションです。使用法:

transactional() { 
// do stuff in transaction 
} 

https://github.com/ewolff/scala-spring/blob/master/src/main/scala/de/adesso/scalaspring/tx/TransactionManagement.scala

https://github.com/ewolff/scala-spring/blob/master/src/main/scala/de/adesso/scalaspring/tx/TransactionAttributeWithRollbackRules.scala

はここで見つける:http://www.slideshare.net/ewolff/scala-and-spring(スライド41)

ライセンス:Apacheの

スカラ座やお春の @Transactionalサポートに関する特別なものは何もありません
1

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! 
関連する問題