From 1f13516528a5884a1182649566a33f6dd0cc4e68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Mon, 9 Nov 2020 15:50:12 +0100 Subject: [PATCH] Fix @Transactional support on suspending function With this commit, @Transactional on suspending functions returning a value now commits the transaction properly. Closes gh-25998 --- .../transaction/interceptor/TransactionAspectSupport.java | 4 ++-- .../CoroutinesAnnotationTransactionInterceptorTests.kt | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java index 9ae7a02927..6513dbc6ab 100644 --- a/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java +++ b/spring-tx/src/main/java/org/springframework/transaction/interceptor/TransactionAspectSupport.java @@ -875,8 +875,8 @@ public abstract class TransactionAspectSupport implements BeanFactoryAware, Init String joinpointIdentification = methodIdentification(method, targetClass, txAttr); - // Optimize for Mono - if (Mono.class.isAssignableFrom(method.getReturnType())) { + // For Mono and suspending functions not returning kotlinx.coroutines.flow.Flow + if (Mono.class.isAssignableFrom(method.getReturnType()) || (KotlinDetector.isSuspendingFunction(method) && !COROUTINES_FLOW_CLASS_NAME.equals(new MethodParameter(method, -1).getParameterType().getName()))) { return TransactionContextManager.currentContext().flatMap(context -> createTransactionIfNecessary(rtm, txAttr, joinpointIdentification).flatMap(it -> { try { diff --git a/spring-tx/src/test/kotlin/org/springframework/transaction/annotation/CoroutinesAnnotationTransactionInterceptorTests.kt b/spring-tx/src/test/kotlin/org/springframework/transaction/annotation/CoroutinesAnnotationTransactionInterceptorTests.kt index cb66de8f06..76dde1c9fd 100644 --- a/spring-tx/src/test/kotlin/org/springframework/transaction/annotation/CoroutinesAnnotationTransactionInterceptorTests.kt +++ b/spring-tx/src/test/kotlin/org/springframework/transaction/annotation/CoroutinesAnnotationTransactionInterceptorTests.kt @@ -19,7 +19,6 @@ package org.springframework.transaction.annotation import kotlinx.coroutines.delay import kotlinx.coroutines.runBlocking import org.assertj.core.api.Assertions -import org.junit.jupiter.api.Disabled import org.junit.jupiter.api.Test import org.springframework.aop.framework.ProxyFactory import org.springframework.transaction.interceptor.TransactionInterceptor @@ -64,7 +63,6 @@ class CoroutinesAnnotationTransactionInterceptorTests { } @Test - @Disabled("Currently fails due to gh-25998") fun suspendingValueSuccess() { val proxyFactory = ProxyFactory() proxyFactory.setTarget(TestWithCoroutines())