From 7140ab5bcaf6432861d0eee06755ccb96dd34299 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Mon, 12 Jan 2026 10:41:03 +0100 Subject: [PATCH] Simplify TransactionalOperator.executeAndAwait This commit simplifies TransactionalOperator.executeAndAwait by removing Optional. It is based on a proposal by @vlsi refined to handle properly reactive transaction commits (see related commit 217b6e37a64b2df7f7265cfff1adf52361872469). Closes gh-36039 --- .../reactive/TransactionalOperatorExtensions.kt | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/spring-tx/src/main/kotlin/org/springframework/transaction/reactive/TransactionalOperatorExtensions.kt b/spring-tx/src/main/kotlin/org/springframework/transaction/reactive/TransactionalOperatorExtensions.kt index 1e899c1c157..a97622cc90b 100644 --- a/spring-tx/src/main/kotlin/org/springframework/transaction/reactive/TransactionalOperatorExtensions.kt +++ b/spring-tx/src/main/kotlin/org/springframework/transaction/reactive/TransactionalOperatorExtensions.kt @@ -20,11 +20,10 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.currentCoroutineContext import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.reactive.asFlow -import kotlinx.coroutines.reactive.awaitLast +import kotlinx.coroutines.reactive.awaitFirstOrNull import kotlinx.coroutines.reactor.asFlux import kotlinx.coroutines.reactor.mono import org.springframework.transaction.ReactiveTransaction -import java.util.* import kotlin.coroutines.CoroutineContext import kotlin.coroutines.EmptyCoroutineContext @@ -47,6 +46,6 @@ fun Flow.transactional(operator: TransactionalOperator, context: Co */ suspend fun TransactionalOperator.executeAndAwait(f: suspend (ReactiveTransaction) -> T): T { val context = currentCoroutineContext().minusKey(Job.Key) - return execute { status -> mono(context) { f(status) } }.map { value -> Optional.ofNullable(value) } - .defaultIfEmpty(Optional.empty()).awaitLast().orElse(null) + @Suppress("UNCHECKED_CAST") + return execute { status -> mono(context) { f(status) } }.singleOrEmpty().awaitFirstOrNull() as T }