spring 在回调函数上应用@ transmitting

t3psigkw  于 2024-01-05  发布在  Spring
关注(0)|答案(1)|浏览(152)

如何将@ transmitting注解应用于回调函数?
我有两个服务类:

  1. @Service
  2. class PersonService(
  3. private val personRepository: PersonRepository,
  4. private val schedulerService: SchedulerService,
  5. ) {
  6. fun someMethod() {
  7. schedulerService.scheduleTask(this::someTransactionalMethod)
  8. }
  9. @Transactional
  10. fun someTransactionalMethod(int: Int) {
  11. personRepository.streamAllBy().forEach {
  12. println(it)
  13. }
  14. }
  15. }

个字符
(The Task只是我回调函数的一个函数接口:)

  1. fun interface Task {
  2. fun execute(int: Int)
  3. }


调用PersonService.someMethod(),我得到一个异常:
org.springframework.dao. InvalidDataBase ApiUsageException:您试图执行一个流查询方法,而不使用周围的transaction来保持连接打开,以便实际上可以使用Stream;请确保使用流的代码使用@ transaction或任何其他声明(只读)transaction的方式
我期望@Transactional注解创建一个transaction,因为caller和called方法都在单独的spring bean中,所以我不明白为什么代理不工作。
然而,我注意到,如果我将someTransactionalMethod移动到第三个服务,并将其引用为类似schedulerService.scheduleTask(thirdService::someTransactionalMethod)的东西,代理工作正常。
有什么建议吗?为什么会这样,以及如何使用来自同一服务的回调函数?

mu0hgdu0

mu0hgdu01#

这是因为框架(Spring?)仅在使用依赖注入时才通过代理替换对transactional方法的引用。您传递了一个引用原始PersonService类的someTransactionalMethod的lambda,并且框架没有机会通过代理替换它。正如您自己发现的那样,将调用 Package 在另一个级别的组件中解决了这个问题。

相关问题