Skip to content

Commit e3f1bc8

Browse files
committed
Allow resolution of optional HandlerMethod
Closes gh-35067
1 parent 1908683 commit e3f1bc8

File tree

2 files changed

+18
-0
lines changed

2 files changed

+18
-0
lines changed

spring-web/src/main/java/org/springframework/web/method/support/InvocableHandlerMethod.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,10 @@ public void setMethodValidator(@Nullable MethodValidator methodValidator) {
217217
if (args[i] != null) {
218218
continue;
219219
}
220+
if (parameter.getParameterType().equals(HandlerMethod.class) && parameter.isOptional()) {
221+
args[i] = null;
222+
continue;
223+
}
220224
if (!this.resolvers.supportsParameter(parameter)) {
221225
throw new IllegalStateException(formatArgumentError(parameter, "No suitable resolver"));
222226
}

spring-web/src/test/java/org/springframework/web/method/support/InvocableHandlerMethodTests.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,15 @@
1818

1919
import java.lang.reflect.Method;
2020

21+
import org.jspecify.annotations.Nullable;
2122
import org.junit.jupiter.api.BeforeEach;
2223
import org.junit.jupiter.api.Test;
2324

2425
import org.springframework.core.MethodParameter;
2526
import org.springframework.web.bind.support.WebDataBinderFactory;
2627
import org.springframework.web.context.request.NativeWebRequest;
2728
import org.springframework.web.context.request.ServletWebRequest;
29+
import org.springframework.web.method.HandlerMethod;
2830
import org.springframework.web.testfixture.method.ResolvableMethod;
2931
import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
3032
import org.springframework.web.testfixture.servlet.MockHttpServletResponse;
@@ -105,6 +107,14 @@ void resolveProvidedArgFirst() throws Exception {
105107
assertThat(value).isEqualTo("2-value2");
106108
}
107109

110+
@Test
111+
void resolveHandlerMethodArgToNull() throws Exception {
112+
Object value = getInvocable(HandlerMethod.class).invokeForRequest(request, null);
113+
114+
assertThat(value).isNotNull();
115+
assertThat(value).isEqualTo("success");
116+
}
117+
108118
@Test
109119
void exceptionInResolvingArg() {
110120
this.composite.addResolver(new ExceptionRaisingArgumentResolver());
@@ -184,6 +194,10 @@ public void handle(double amount) {
184194
public void handleWithException(Throwable ex) throws Throwable {
185195
throw ex;
186196
}
197+
198+
public String handleHandlerMethod(@Nullable HandlerMethod handlerMethod) {
199+
return "success";
200+
}
187201
}
188202

189203

0 commit comments

Comments
 (0)