diff --git a/spring-aop/src/main/java/org/springframework/aop/framework/CoroutinesUtils.java b/spring-aop/src/main/java/org/springframework/aop/framework/CoroutinesUtils.java index e1b279fe572..ac00faca851 100644 --- a/spring-aop/src/main/java/org/springframework/aop/framework/CoroutinesUtils.java +++ b/spring-aop/src/main/java/org/springframework/aop/framework/CoroutinesUtils.java @@ -128,7 +128,7 @@ abstract class CoroutinesUtils { for (KFunction candidate : KClasses.getDeclaredMemberFunctions(superClass)) { if (candidate.getName().equals(function.getName()) && candidate.isSuspend() && hasSameParameterTypes(function, candidate, superType) && - candidate.getReturnType().getClassifier() != valueKClass) { + !valueKClass.equals(candidate.getReturnType().getClassifier())) { return true; } } diff --git a/spring-aop/src/test/kotlin/org/springframework/aop/framework/CglibAopProxyKotlinTests.kt b/spring-aop/src/test/kotlin/org/springframework/aop/framework/CglibAopProxyKotlinTests.kt index 5b6477c16f1..413b35c80d8 100644 --- a/spring-aop/src/test/kotlin/org/springframework/aop/framework/CglibAopProxyKotlinTests.kt +++ b/spring-aop/src/test/kotlin/org/springframework/aop/framework/CglibAopProxyKotlinTests.kt @@ -282,6 +282,28 @@ class CglibAopProxyKotlinTests { assertThat(proxy.returnValue()).isEqualTo(ValueClass("bar")) } + @Test + suspend fun proxiedSuspendedInvocationValueClassOverridingValueClass() { + val proxyFactory = ProxyFactory(ValueClassOverridingValueClassBean()) + proxyFactory.isProxyTargetClass = true + proxyFactory.addAdvice(MethodInterceptor { + ValueClass("bar") + }) + val proxy = proxyFactory.proxy as ValueClassOverridingValueClassBean + assertThat(proxy.returnValue()).isEqualTo(ValueClass("bar")) + } + + @Test + suspend fun proxiedSuspendedInvocationValueClassOverridingValueClassProceed() { + val proxyFactory = ProxyFactory(ValueClassOverridingValueClassBean()) + proxyFactory.isProxyTargetClass = true + proxyFactory.addAdvice(MethodInterceptor { + it.proceed() + }) + val proxy = proxyFactory.proxy as ValueClassOverridingValueClassBean + assertThat(proxy.returnValue()).isEqualTo(ValueClass("foo")) + } + @Test suspend fun proxiedSuspendedInvocationValueClassOverridingGeneric() { val proxyFactory = ProxyFactory(ValueClassOverridingGenericBean()) @@ -473,6 +495,17 @@ class CglibAopProxyKotlinTests { } } + interface ValueClassBean { + suspend fun returnValue(): ValueClass + } + + open class ValueClassOverridingValueClassBean : ValueClassBean { + override suspend fun returnValue(): ValueClass { + delay(10.milliseconds) + return ValueClass("foo") + } + } + interface GenericBean { suspend fun returnValue(): T } diff --git a/spring-aop/src/test/kotlin/org/springframework/aop/framework/JdkDynamicAopProxyKotlinTests.kt b/spring-aop/src/test/kotlin/org/springframework/aop/framework/JdkDynamicAopProxyKotlinTests.kt index 9c4122638b8..eb866fedb3c 100644 --- a/spring-aop/src/test/kotlin/org/springframework/aop/framework/JdkDynamicAopProxyKotlinTests.kt +++ b/spring-aop/src/test/kotlin/org/springframework/aop/framework/JdkDynamicAopProxyKotlinTests.kt @@ -252,6 +252,26 @@ class JdkDynamicAopProxyKotlinTests { assertThat(proxy.returnValue()).isEqualTo(ValueClass("bar")) } + @Test + suspend fun proxiedSuspendedInvocationValueClassOverridingValueClass() { + val proxyFactory = ProxyFactory(ValueClassOverridingValueClassBeanImpl()) + proxyFactory.addAdvice(MethodInterceptor { + ValueClass("bar") + }) + val proxy = proxyFactory.proxy as ValueClassOverridingValueClassBean + assertThat(proxy.returnValue()).isEqualTo(ValueClass("bar")) + } + + @Test + suspend fun proxiedSuspendedInvocationValueClassOverridingValueClassProceed() { + val proxyFactory = ProxyFactory(ValueClassOverridingValueClassBeanImpl()) + proxyFactory.addAdvice(MethodInterceptor { + it.proceed() + }) + val proxy = proxyFactory.proxy as ValueClassOverridingValueClassBean + assertThat(proxy.returnValue()).isEqualTo(ValueClass("foo")) + } + @Test suspend fun proxiedSuspendedInvocationValueClassOverridingGeneric() { val proxyFactory = ProxyFactory(ValueClassOverridingGenericBeanImpl()) @@ -421,6 +441,21 @@ class JdkDynamicAopProxyKotlinTests { } } + interface ValueClassBean { + suspend fun returnValue(): ValueClass + } + + interface ValueClassOverridingValueClassBean : ValueClassBean { + override suspend fun returnValue(): ValueClass + } + + class ValueClassOverridingValueClassBeanImpl : ValueClassOverridingValueClassBean { + override suspend fun returnValue(): ValueClass { + delay(10.milliseconds) + return ValueClass("foo") + } + } + interface GenericBean { suspend fun returnValue(): T }