spring 在回调函数上应用@ transmitting

t3psigkw  于 5个月前  发布在  Spring
关注(0)|答案(1)|浏览(68)

如何将@ 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)的东西,代理工作正常。
有什么建议吗?为什么会这样,以及如何使用来自同一服务的回调函数?

mu0hgdu0

mu0hgdu01#

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

相关问题