Il n'y a rien de spécial sur le soutien du printemps @Transactional
à Scala et vous peut l'utiliser sans aucun code Java. Assurez-vous simplement que vous avez des traits «purs» pour les beans, dont les implémentations utiliseraient l'annotation @Transactional
. Vous devez également déclarer un bean avec le type PlatformTransactionManager
(si vous utilisez la configuration Spring basée sur .xml, vous devez utiliser "transactionManager" pour le nom du bean, voir EnableTransactionManagement's JavaDoc pour plus de détails). En outre, si vous utilisez des classes de configuration basées sur des annotations, assurez-vous que ces classes sont placées dans leurs propres fichiers dédiés, c'est-à-dire ne placez aucune autre classe (l'objet compagnon est OK) dans le même fichier. Voici exemple de travail simple:
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!
Une solution simple (ou solution de contournement) peuvent être de mettre les annotations sur les interfaces Java et faites votre Les classes Scala implémentent ces interfaces. –
Cela n'est pas possible si vous utilisez Spring Aspects pour tisser les transactions. La transaction n'est pas lancée si l'annotation est à l'interface. – timomeinen