mirror of
https://github.com/spring-projects/spring-framework
synced 2026-06-08 17:33:33 +00:00
Apply nullable value class fix to InvocableHandlerMethod
See gh-36449
This commit is contained in:
@@ -230,7 +230,7 @@ class CoroutinesUtilsTests {
|
||||
}
|
||||
|
||||
@Test
|
||||
suspend fun invokeSuspendingFunctionWithNullableValueClassParameterWithNonnullObject() {
|
||||
suspend fun invokeSuspendingFunctionWithNullableValueClassParameterAndNonNullParameter() {
|
||||
val method = CoroutinesUtilsTests::class.java.declaredMethods.first { it.name.startsWith("suspendingFunctionWithNullableValueClass") }
|
||||
val mono = CoroutinesUtils.invokeSuspendingFunction(method, this, ValueClass("foo"), null) as Mono
|
||||
Assertions.assertThat(mono.awaitSingleOrNull()).isEqualTo("foo")
|
||||
|
||||
+2
-2
@@ -316,7 +316,7 @@ public class InvocableHandlerMethod extends HandlerMethod {
|
||||
Object arg = args[index];
|
||||
if (!(parameter.isOptional() && arg == null)) {
|
||||
KType type = parameter.getType();
|
||||
if (!(type.isMarkedNullable() && arg == null) &&
|
||||
if (!type.isMarkedNullable() &&
|
||||
type.getClassifier() instanceof KClass<?> kClass &&
|
||||
KotlinDetector.isInlineClass(JvmClassMappingKt.getJavaClass(kClass))) {
|
||||
arg = box(kClass, arg);
|
||||
@@ -337,7 +337,7 @@ public class InvocableHandlerMethod extends HandlerMethod {
|
||||
private static Object box(KClass<?> kClass, @Nullable Object arg) {
|
||||
KFunction<?> constructor = Objects.requireNonNull(KClasses.getPrimaryConstructor(kClass));
|
||||
KType type = constructor.getParameters().get(0).getType();
|
||||
if (!(type.isMarkedNullable() && arg == null) &&
|
||||
if (!type.isMarkedNullable() &&
|
||||
type.getClassifier() instanceof KClass<?> parameterClass &&
|
||||
KotlinDetector.isInlineClass(JvmClassMappingKt.getJavaClass(parameterClass))) {
|
||||
arg = box(parameterClass, arg);
|
||||
|
||||
+7
@@ -148,6 +148,13 @@ class InvocableHandlerMethodKotlinTests {
|
||||
Assertions.assertThatIllegalArgumentException().isThrownBy { invocable.invokeForRequest(request, null) }
|
||||
}
|
||||
|
||||
@Test
|
||||
fun valueClassWithNullableAndNonNullParameter() {
|
||||
composite.addResolver(StubArgumentResolver(LongValueClass::class.java, LongValueClass(1)))
|
||||
val value = getInvocable(ValueClassHandler::valueClassWithNullable.javaMethod!!).invokeForRequest(request, null)
|
||||
Assertions.assertThat(value).isEqualTo(1L)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun valueClassWithNullable() {
|
||||
composite.addResolver(StubArgumentResolver(LongValueClass::class.java, null))
|
||||
|
||||
+3
-3
@@ -329,7 +329,7 @@ public class InvocableHandlerMethod extends HandlerMethod {
|
||||
private static final String COROUTINE_CONTEXT_ATTRIBUTE = "org.springframework.web.server.CoWebFilter.context";
|
||||
|
||||
@SuppressWarnings("DataFlowIssue")
|
||||
public static @Nullable Object invokeFunction(Method method, Object target, Object[] args, boolean isSuspendingFunction,
|
||||
public static @Nullable Object invokeFunction(Method method, Object target, @Nullable Object[] args, boolean isSuspendingFunction,
|
||||
ServerWebExchange exchange) throws InvocationTargetException, IllegalAccessException, NoSuchMethodException {
|
||||
|
||||
if (isSuspendingFunction) {
|
||||
@@ -356,7 +356,7 @@ public class InvocableHandlerMethod extends HandlerMethod {
|
||||
Object arg = args[index];
|
||||
if (!(parameter.isOptional() && arg == null)) {
|
||||
KType type = parameter.getType();
|
||||
if (!(type.isMarkedNullable() && arg == null) &&
|
||||
if (!type.isMarkedNullable() &&
|
||||
type.getClassifier() instanceof KClass<?> kClass &&
|
||||
KotlinDetector.isInlineClass(JvmClassMappingKt.getJavaClass(kClass))) {
|
||||
arg = box(kClass, arg);
|
||||
@@ -378,7 +378,7 @@ public class InvocableHandlerMethod extends HandlerMethod {
|
||||
private static Object box(KClass<?> kClass, @Nullable Object arg) {
|
||||
KFunction<?> constructor = Objects.requireNonNull(KClasses.getPrimaryConstructor(kClass));
|
||||
KType type = constructor.getParameters().get(0).getType();
|
||||
if (!(type.isMarkedNullable() && arg == null) &&
|
||||
if (!type.isMarkedNullable() &&
|
||||
type.getClassifier() instanceof KClass<?> parameterClass &&
|
||||
KotlinDetector.isInlineClass(JvmClassMappingKt.getJavaClass(parameterClass))) {
|
||||
arg = box(parameterClass, arg);
|
||||
|
||||
+8
@@ -250,6 +250,14 @@ class InvocableHandlerMethodKotlinTests {
|
||||
assertExceptionThrown(result, IllegalArgumentException::class)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun valueClassWithNullableAndNonNullParameter() {
|
||||
this.resolvers.add(stubResolver(LongValueClass(1), LongValueClass::class.java))
|
||||
val method = ValueClassController::valueClassWithNullable.javaMethod!!
|
||||
val result = invoke(ValueClassController(), method)
|
||||
assertHandlerResultValue(result, "1")
|
||||
}
|
||||
|
||||
@Test
|
||||
fun valueClassWithNullable() {
|
||||
this.resolvers.add(stubResolver(null, LongValueClass::class.java))
|
||||
|
||||
Reference in New Issue
Block a user