2017-03-04 11 views
2

@Transactionalメソッドの呼び出し中にBeanのプロパティがnullになる問題が発生しました。 初期化中にBeanプロパティがNULLにならない@Transactionalメソッド呼び出し時にNULLになる

  • UserService

    は、これらの特性は、これらの特性を有する
  • ヌルになる
  • userRepositorypasswordServiceは(@Transactionalである)のregisterUserの起動時初期化(afterPropertiesSet)
  • 中に非ヌルである@Configurationクラス内で宣言豆でありますnull不可能なタイプ
  • プリントに基づいてUserServiceの同じインスタンス/ Beanが使用されています
  • @Transactionalを削除すると、何もに

サービス行わないように思わ

  • @EnableTransactionManagementを追加または削除問題を修正するようだ:

    open class UserService (val userRepository: UserRepository, 
             val passwordService: PasswordService) : InitializingBean { 
    
        override fun afterPropertiesSet() { 
         println("### this.afterPropertiesSet") 
         println("### this: " + this) 
         println("### userRepository: " + userRepository) 
         println("### passwordService: " + passwordService) 
        } 
    
        @Transactional 
        fun registerUser(request: UserRegistrationRequest): User { 
         println("### this.registerUser") 
         println("### this: " + this) 
         println("### userRepository: " + userRepository) 
         println("### passwordService: " + passwordService) 
         val savedUser = this.userRepository.save(request.toUser()) 
         this.passwordService.savePassword(savedUser, request.password) 
         return savedUser 
        } 
    
        private fun UserRegistrationRequest.toUser(): User { ... } 
    
    } 
    

    コントローラー:

    @Controller 
    class UserController (val userService: UserService) : InitializingBean { 
        override fun afterPropertiesSet() { 
         println("### controller.afterPropertiesSet: " + userService) 
         println("### user service: " + userService) 
        } 
    
        @PostMapping("/users") 
        fun registerUser(@RequestBody userDetails: UserDetailsDto): ResponseEntity<UserDto> { 
         println("### controller.registerUser: " + userService) 
         println("### user service: " + userService) 
         val registeredUser = userService.registerUser(userDetails.toUserRegistrationRequest()) 
         return ResponseEntity.ok(registeredUser.toDto()) 
        } 
    
        private fun UserDetailsDto.toUserRegistrationRequest(): UserRegistrationRequest { ... } 
    
        private fun User.toDto(): UserDto { ... } 
    } 
    

    豆宣言:

    を枚の

    プリント:

    ### this.afterPropertiesSet 
    ### this: [email protected] 
    ### userRepository: org.[email protected]1961d75a 
    ### passwordService: [email protected] 
    
    ### controller.afterPropertiesSet: [email protected] 
    ### user service: [email protected] 
    
    ### controller.registerUser: [email protected] 
    ### user service: [email protected] 
    
    ### this.registerUser 
    ### this: [email protected] 
    ### userRepository: null 
    ### passwordService: null 
    

    パッケージ構造

    com.sample.app.Application 
    com.sample.app.ApplicationServicesConfiguration 
    com.sample.app.user.UserController 
    com.sample.app.user.UserService 
    com.sample.app.user.UserRepository 
    com.sample.app.user.PasswordService 
    

    が、これは春のバグですか?またはKotlin-Springの統合特有の機能ですか?

  • +0

    あなたは 'Service' @で注釈' UserService'試しましたか? –

    +0

    私はしませんでした。しかし、私は '@ Configuration'クラスの中で' @ Bean'としてUserServiceを宣言しました。明快にするためにBean宣言を追加しました。 – Chad

    +0

    @BranislavLazicはリクエスト通りにパッケージ構造を追加しました – Chad

    答えて

    0

    トランザクション機能をオープンとしてマークしてください。

    オープンとしてすべてのクラスをマーキングするためのGradleプラグインがあります:

    buildscript{ 
        dependencies { 
         classpath("org.jetbrains.kotlin:kotlin-allopen:$kotlinVersion") 
        } 
    } 
    apply plugin: 'kotlin-spring' 
    
    関連する問題