我们有一个混合的 Java 和 Scala 项目,它使用 Spring 事务管理。我们使用 Spring 方面来编织带有 @Transactional 注释方法的文件。
问题是,Scala 类没有与 Spring 事务方面结合在一起。如何配置 Spring 以处理 Scala 中的事务?
我们有一个混合的 Java 和 Scala 项目,它使用 Spring 事务管理。我们使用 Spring 方面来编织带有 @Transactional 注释方法的文件。
问题是,Scala 类没有与 Spring 事务方面结合在一起。如何配置 Spring 以处理 Scala 中的事务?
Spring 需要您的事务边界以 Spring 管理的 bean 开始,因此这排除了@Transactional
Scala 类。
听起来简单的解决方案是制作服务外观,这些外观是@Transactional
作为 Spring bean 实例化的 Java 类。这些可以委托给您的 Scala 服务/核心代码。
仅 Scala 的解决方案是使用 Eberhard Wolff 的闭包来创建手动事务。用法:
transactional() {
// do stuff in transaction
}
在这里找到:http ://www.slideshare.net/ewolff/scala-and-spring (幻灯片 41)
许可证:阿帕奇
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!