4

我们有一个混合的 Java 和 Scala 项目,它使用 Spring 事务管理。我们使用 Spring 方面来编织带有 @Transactional 注释方法的文件。

问题是,Scala 类没有与 Spring 事务方面结合在一起。如何配置 Spring 以处理 Scala 中的事务?

4

3 回答 3

3

Spring 需要您的事务边界以 Spring 管理的 bean 开始,因此这排除了@TransactionalScala 类。

听起来简单的解决方案是制作服务外观,这些外观是@Transactional作为 Spring bean 实例化的 Java 类。这些可以委托给您的 Scala 服务/核心代码。

于 2011-01-04T05:08:59.820 回答
2

仅 Scala 的解决方案是使用 Eberhard Wolff 的闭包来创建手动事务。用法:

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)

许可证:阿帕奇

于 2012-08-31T22:09:46.343 回答
1

Spring 在 Scala 中的支持没有什么特别之处@Transactional,您可以在没有任何 Java 代码的情况下使用它。只需确保您具有 bean 的“纯”特征,这些实现将使用@Transactional注释。您还应该声明一个具有PlatformTransactionManager类型的 bean(如果您使用基于 .xml 的 Spring 配置,您应该使用“transactionManager”作为 bean 名称,有关详细信息,请参阅EnableTransactionManagement 的 JavaDoc)。此外,如果您使用基于注解的配置类,请确保将这些类放在它们自己的专用文件中,即不要将任何其他类(伴生对象可以)放在同一个文件中。这是一个简单的工作示例:

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!
于 2015-02-08T11:43:56.280 回答