我们有一个混合的Java和Scala项目,它使用Spring事务管理。我们使用Spring方面用@Transactional注释方法编织文件。
问题是,Scala类不是与Spring事务方面编织在一起的。如何配置Spring以在Scala中考虑事务?
答案 0 :(得分:3)
Spring需要您的事务边界以Spring管理的bean开头,因此这排除了@Transactional
Scala类。
听起来简单的解决方案是将@Transactional
Java类的服务外观实例化为Spring bean。这些可以委托给您的Scala服务/核心代码。
答案 1 :(得分:2)
仅限Scala的解决方案是使用Eberhard Wolff的闭包来创建手动事务。用法:
transactional() {
// do stuff in transaction
}
在此处找到:http://www.slideshare.net/ewolff/scala-and-spring(幻灯片41)
许可证:Apache
答案 2 :(得分:1)
Spring中对Scala的@Transactional
支持没有什么特别之处,您可以在没有任何Java代码的情况下使用它。只要确保你有bean的“纯”特征,哪些实现将使用@Transactional
注释。您还应声明一个PlatformTransactionManager
类型的bean(如果您使用的是基于.xml的Spring配置,则应使用“transactionManager”作为bean名称,有关详细信息,请参阅EnableTransactionManagement's 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!