2010-12-08 7 views
4

우리는 Spring 트랜잭션 관리를 사용하는 혼합 된 Java 및 Scala 프로젝트를 보유하고 있습니다. 우리는 Spring aspect를 사용하여 @Transactional annotated 메소드로 파일을 짜 맞추고있다.스칼라에서 Spring @Transactional 사용

문제는 스칼라 클래스가 Spring 트랜잭션 측면과 얽혀 있지 않다는 점입니다. 스칼라에서 트랜잭션을 고려하여 Spring을 어떻게 구성 할 수 있습니까?

+0

한 간단한 솔루션 (또는 해결 방법) Java 인터페이스에 주석을 넣어 만들 수 있습니다 당신의 스칼라 클래스는 이러한 인터페이스를 구현합니다. –

+0

Spring Aspect를 사용하여 트랜잭션을 직조하는 경우 불가능합니다. 어노테이션이 인터페이스에있는 경우 트랜잭션이 시작되지 않습니다. – timomeinen

답변

3

Spring은 Spring 관리 Bean으로 시작하려면 트랜잭션 경계가 필요하므로 @Transactional 스칼라 클래스는 제외됩니다.

간단한 해결책은 @Transactional 인 서비스 facades를 만드는 것입니다. Java 클래스는 스프링 빈으로 인스턴스화됩니다. 이들은 스칼라 서비스/핵심 코드에 위임 할 수 있습니다.

2

스칼라 만의 해결책은 수동 트랜잭션을 만드는 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)

라이센스 : 아파치

스칼라와 봄의 @Transactional 지원에 대한 특별한 아무것도 없다
1

Java 코드없이 사용할 수 있습니다. 빈에 대해 "순수한"특성을 가지고 있는지 확인하십시오. 구현시 @Transactional 주석을 사용합니다. 또한 PlatformTransactionManager 유형의 bean을 선언해야합니다 (.xml 기반 Spring 구성을 사용하는 경우 bean 이름에 "transactionManager"를 사용해야합니다. 자세한 내용은 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! 
관련 문제