2
@Transactional
メソッドの呼び出し中にBeanのプロパティがnullになる問題が発生しました。 初期化中にBeanプロパティがNULLにならない@Transactionalメソッド呼び出し時にNULLになる
UserService
は、これらの特性は、これらの特性を有する- ヌルになる
userRepository
とpasswordService
は(@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の統合特有の機能ですか?
あなたは 'Service' @で注釈' UserService'試しましたか? –
私はしませんでした。しかし、私は '@ Configuration'クラスの中で' @ Bean'としてUserServiceを宣言しました。明快にするためにBean宣言を追加しました。 – Chad
@BranislavLazicはリクエスト通りにパッケージ構造を追加しました – Chad