diff --git a/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java b/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java index e218ab6e29d..003ad085735 100644 --- a/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java +++ b/spring-core/src/main/java/org/springframework/core/CoroutinesUtils.java @@ -115,7 +115,7 @@ public abstract class CoroutinesUtils { Assert.isTrue(KotlinDetector.isSuspendingFunction(method), "Method must be a suspending function"); KFunction function = ReflectJvmMapping.getKotlinFunction(method); Assert.notNull(function, () -> "Failed to get Kotlin function for method: " + method); - if (method.isAccessible() && !KCallablesJvm.isAccessible(function)) { + if (!KCallablesJvm.isAccessible(function)) { KCallablesJvm.setAccessible(function, true); } Mono mono = MonoKt.mono(context, (scope, continuation) -> { diff --git a/spring-core/src/test/kotlin/org/springframework/core/CoroutinesUtilsTests.kt b/spring-core/src/test/kotlin/org/springframework/core/CoroutinesUtilsTests.kt index 6aee679df09..2940f1d3ff7 100644 --- a/spring-core/src/test/kotlin/org/springframework/core/CoroutinesUtilsTests.kt +++ b/spring-core/src/test/kotlin/org/springframework/core/CoroutinesUtilsTests.kt @@ -93,6 +93,17 @@ class CoroutinesUtilsTests { } } + @Test + fun invokePrivateSuspendingFunction() { + val method = CoroutinesUtilsTests::class.java.getDeclaredMethod("privateSuspendingFunction", String::class.java, Continuation::class.java) + val publisher = CoroutinesUtils.invokeSuspendingFunction(method, this, "foo") + Assertions.assertThat(publisher).isInstanceOf(Mono::class.java) + StepVerifier.create(publisher) + .expectNext("foo") + .expectComplete() + .verify() + } + @Test fun invokeNonSuspendingFunction() { val method = CoroutinesUtilsTests::class.java.getDeclaredMethod("nonSuspendingFunction", String::class.java) @@ -252,6 +263,11 @@ class CoroutinesUtilsTests { return value } + private suspend fun privateSuspendingFunction(value: String): String { + delay(1) + return value + } + suspend fun suspendingFunctionWithNullable(value: String?): String? { delay(1) return value diff --git a/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java b/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java index a32fd354737..ceca9d8094e 100644 --- a/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java +++ b/spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java @@ -305,7 +305,7 @@ public class InvocableHandlerMethod extends HandlerMethod { if (function == null) { return method.invoke(target, args); } - if (method.isAccessible() && !KCallablesJvm.isAccessible(function)) { + if (!KCallablesJvm.isAccessible(function)) { KCallablesJvm.setAccessible(function, true); } Map argMap = CollectionUtils.newHashMap(args.length + 1); diff --git a/spring-web/src/test/kotlin/org/springframework/web/method/support/InvocableHandlerMethodKotlinTests.kt b/spring-web/src/test/kotlin/org/springframework/web/method/support/InvocableHandlerMethodKotlinTests.kt index 82cac5450d7..645c10c1f62 100644 --- a/spring-web/src/test/kotlin/org/springframework/web/method/support/InvocableHandlerMethodKotlinTests.kt +++ b/spring-web/src/test/kotlin/org/springframework/web/method/support/InvocableHandlerMethodKotlinTests.kt @@ -84,6 +84,15 @@ class InvocableHandlerMethodKotlinTests { Assertions.assertThat(value).isNull() } + @Test + fun private() { + composite.addResolver(StubArgumentResolver(Float::class.java, 1.2f)) + val value = getInvocable(Handler::class.java, Float::class.java).invokeForRequest(request, null) + + Assertions.assertThat(getStubResolver(0).resolvedParameters).hasSize(1) + Assertions.assertThat(value).isEqualTo("1.2") + } + @Test fun valueClass() { composite.addResolver(StubArgumentResolver(Long::class.java, 1L)) @@ -182,6 +191,8 @@ class InvocableHandlerMethodKotlinTests { return null } + private fun private(value: Float) = value.toString() + } private class ValueClassHandler { diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java index 82ad5c2c6b6..72cfe21d5be 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/result/method/InvocableHandlerMethod.java @@ -318,7 +318,7 @@ public class InvocableHandlerMethod extends HandlerMethod { if (function == null) { return method.invoke(target, args); } - if (method.isAccessible() && !KCallablesJvm.isAccessible(function)) { + if (!KCallablesJvm.isAccessible(function)) { KCallablesJvm.setAccessible(function, true); } Map argMap = CollectionUtils.newHashMap(args.length + 1); diff --git a/spring-webflux/src/test/kotlin/org/springframework/web/reactive/result/InvocableHandlerMethodKotlinTests.kt b/spring-webflux/src/test/kotlin/org/springframework/web/reactive/result/InvocableHandlerMethodKotlinTests.kt index bccfa8930db..c94cd6bdb81 100644 --- a/spring-webflux/src/test/kotlin/org/springframework/web/reactive/result/InvocableHandlerMethodKotlinTests.kt +++ b/spring-webflux/src/test/kotlin/org/springframework/web/reactive/result/InvocableHandlerMethodKotlinTests.kt @@ -112,11 +112,18 @@ class InvocableHandlerMethodKotlinTests { @Test fun privateController() { this.resolvers.add(stubResolver("foo")) - val method = PrivateCoroutinesController::singleArg.javaMethod!! - val result = invoke(PrivateCoroutinesController(), method,"foo") + val method = PrivateController::singleArg.javaMethod!! + val result = invoke(PrivateController(), method,"foo") assertHandlerResultValue(result, "success:foo") } + @Test + fun privateFunction() { + val method = PrivateController::class.java.getDeclaredMethod("private") + val result = invoke(PrivateController(), method) + assertHandlerResultValue(result, "private") + } + @Test fun defaultValue() { this.resolvers.add(stubResolver(null, String::class.java)) @@ -330,12 +337,14 @@ class InvocableHandlerMethodKotlinTests { } } - private class PrivateCoroutinesController { + private class PrivateController { suspend fun singleArg(q: String?): String { delay(1) return "success:$q" } + + private fun private() = "private" } class DefaultValueController {