diff --git a/spring-web/src/main/java/org/springframework/web/service/invoker/HttpMethodArgumentResolver.java b/spring-web/src/main/java/org/springframework/web/service/invoker/HttpMethodArgumentResolver.java index 4be874d87b..5de5c14868 100644 --- a/spring-web/src/main/java/org/springframework/web/service/invoker/HttpMethodArgumentResolver.java +++ b/spring-web/src/main/java/org/springframework/web/service/invoker/HttpMethodArgumentResolver.java @@ -37,18 +37,18 @@ public class HttpMethodArgumentResolver implements HttpServiceArgumentResolver { @Override - public void resolve( + public boolean resolve( @Nullable Object argument, MethodParameter parameter, HttpRequestValues.Builder requestValues) { - if (argument == null) { - return; - } if (argument instanceof HttpMethod httpMethod) { if (logger.isTraceEnabled()) { logger.trace("Resolved HTTP method to: " + httpMethod.name()); } requestValues.setHttpMethod(httpMethod); + return true; } + + return false; } } diff --git a/spring-web/src/main/java/org/springframework/web/service/invoker/HttpServiceArgumentResolver.java b/spring-web/src/main/java/org/springframework/web/service/invoker/HttpServiceArgumentResolver.java index 4c68475e02..8ba058e741 100644 --- a/spring-web/src/main/java/org/springframework/web/service/invoker/HttpServiceArgumentResolver.java +++ b/spring-web/src/main/java/org/springframework/web/service/invoker/HttpServiceArgumentResolver.java @@ -35,7 +35,8 @@ public interface HttpServiceArgumentResolver { * @param argument the argument value * @param parameter the method parameter for the argument * @param requestValues builder to add HTTP request values to + * @return {@code true} if the argument was resolved, {@code false} otherwise */ - void resolve(@Nullable Object argument, MethodParameter parameter, HttpRequestValues.Builder requestValues); + boolean resolve(@Nullable Object argument, MethodParameter parameter, HttpRequestValues.Builder requestValues); } diff --git a/spring-web/src/main/java/org/springframework/web/service/invoker/HttpServiceMethod.java b/spring-web/src/main/java/org/springframework/web/service/invoker/HttpServiceMethod.java index cba2b08a24..764cbc6877 100644 --- a/spring-web/src/main/java/org/springframework/web/service/invoker/HttpServiceMethod.java +++ b/spring-web/src/main/java/org/springframework/web/service/invoker/HttpServiceMethod.java @@ -30,7 +30,6 @@ import reactor.core.publisher.Mono; import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.MethodParameter; -import org.springframework.core.ParameterNameDiscoverer; import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.ReactiveAdapter; import org.springframework.core.ReactiveAdapterRegistry; @@ -81,9 +80,14 @@ final class HttpServiceMethod { private static MethodParameter[] initMethodParameters(Method method) { int count = method.getParameterCount(); + if (count == 0) { + return new MethodParameter[0]; + } + DefaultParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer(); MethodParameter[] parameters = new MethodParameter[count]; for (int i = 0; i < count; i++) { parameters[i] = new MethodParameter(method, i); + parameters[i].initParameterNameDiscovery(nameDiscoverer); } return parameters; } @@ -103,12 +107,12 @@ final class HttpServiceMethod { private void applyArguments(HttpRequestValues.Builder requestValues, Object[] arguments) { Assert.isTrue(arguments.length == this.parameters.length, "Method argument mismatch"); - for (int i = 0; i < this.parameters.length; i++) { - Object argumentValue = arguments[i]; - ParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer(); - this.parameters[i].initParameterNameDiscovery(nameDiscoverer); + for (int i = 0; i < arguments.length; i++) { + Object value = arguments[i]; for (HttpServiceArgumentResolver resolver : this.argumentResolvers) { - resolver.resolve(argumentValue, this.parameters[i], requestValues); + if (resolver.resolve(value, this.parameters[i], requestValues)) { + break; + } } } } diff --git a/spring-web/src/main/java/org/springframework/web/service/invoker/PathVariableArgumentResolver.java b/spring-web/src/main/java/org/springframework/web/service/invoker/PathVariableArgumentResolver.java index 5be129459e..0c80baea54 100644 --- a/spring-web/src/main/java/org/springframework/web/service/invoker/PathVariableArgumentResolver.java +++ b/spring-web/src/main/java/org/springframework/web/service/invoker/PathVariableArgumentResolver.java @@ -55,12 +55,12 @@ public class PathVariableArgumentResolver implements HttpServiceArgumentResolver @SuppressWarnings("unchecked") @Override - public void resolve( + public boolean resolve( @Nullable Object argument, MethodParameter parameter, HttpRequestValues.Builder requestValues) { PathVariable annotation = parameter.getParameterAnnotation(PathVariable.class); if (annotation == null) { - return; + return false; } if (Map.class.isAssignableFrom(parameter.getParameterType())) { @@ -76,6 +76,8 @@ public class PathVariableArgumentResolver implements HttpServiceArgumentResolver Assert.notNull(name, "Failed to determine path variable name for parameter: " + parameter); addUriParameter(name, argument, annotation.required(), requestValues); } + + return true; } private void addUriParameter(