如何将@ transmitting注解应用于回调函数?
我有两个服务类:
@Service
class PersonService(
private val personRepository: PersonRepository,
private val schedulerService: SchedulerService,
) {
fun someMethod() {
schedulerService.scheduleTask(this::someTransactionalMethod)
}
@Transactional
fun someTransactionalMethod(int: Int) {
personRepository.streamAllBy().forEach {
println(it)
}
}
}
个字符
(The Task
只是我回调函数的一个函数接口:)
fun interface Task {
fun execute(int: Int)
}
型
调用PersonService.someMethod()
,我得到一个异常:
org.springframework.dao. InvalidDataBase ApiUsageException:您试图执行一个流查询方法,而不使用周围的transaction来保持连接打开,以便实际上可以使用Stream;请确保使用流的代码使用@ transaction或任何其他声明(只读)transaction的方式
我期望@Transactional
注解创建一个transaction,因为caller和called方法都在单独的spring bean中,所以我不明白为什么代理不工作。
然而,我注意到,如果我将someTransactionalMethod
移动到第三个服务,并将其引用为类似schedulerService.scheduleTask(thirdService::someTransactionalMethod)
的东西,代理工作正常。
有什么建议吗?为什么会这样,以及如何使用来自同一服务的回调函数?
1条答案
按热度按时间mu0hgdu01#
这是因为框架(Spring?)仅在使用依赖注入时才通过代理替换对transactional方法的引用。您传递了一个引用原始PersonService类的someTransactionalMethod的lambda,并且框架没有机会通过代理替换它。正如您自己发现的那样,将调用 Package 在另一个级别的组件中解决了这个问题。