gpt4 book ai didi

java - Spring @Transactional 在 @Service 中阻止 @Autowired

转载 作者:行者123 更新时间:2023-12-04 07:58:43 25 4
gpt4 key购买 nike

我有一堆服务@Autowired服务。当我将其中一种方法更改为 @Transactional 时,它阻止了所有 @Autowired因为它们都是空的。
示例:

@Service
open class UserService {
@Autowired
private val userRepository : UserRepository? = null

@Autowired
private val emailService : EmailService? = null

@Transactional
@Throws(EmailConflictException::class)
open fun insert(newUser: User, context : RequestContext) {
if(!isEmailAvailable(newUser.email)) throw EmailConflictException()
val user = userRepository!!.insert(newUser, context.org.id)
emailService!!.send(userEmailFactory!!.getInviteEmail(user))
}
}
在调用 insert 时,emailService 和 userRepository 在运行时都为 null。如果我删除了 @Transactional从插入方法然后 emailService 和 userRepository 在运行时定义。
为什么会这样?我如何解决它

最佳答案

此问题通常是由于没有 plugin.spring 引起的。项目中的插件。这是因为 Kotlin 类和成员是 final默认情况下,它与 Spring AOP 冲突(即代理 DB 事务)。plugin.springkotlin-allopen 的包装器并包括 Spring 注释,如 @Transactional .
尝试添加 plugin.spring在你的项目中。例如;工作配置如下所示。

plugins {
id("org.springframework.boot") version "2.4.2"
id("io.spring.dependency-management") version "1.0.11.RELEASE"
kotlin("jvm") version "1.4.21"
kotlin("plugin.spring") version "1.4.21"
}
这是文档 - https://kotlinlang.org/docs/all-open-plugin.html#gradle
注意:问题表明类和函数是开放的。理论上应该足够了。但是由于 OP 没有显示完整的项目设置以及如何调用此代码。不知道为什么 open函数没有得到正确初始化的 bean。

关于java - Spring @Transactional 在 @Service 中阻止 @Autowired,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66574284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com