Update HttpMethodArgumentResolver

Boolean return value indicates if the value was resolved or not.

See gh-28386
This commit is contained in:
rstoyanchev 2022-04-27 17:18:03 +01:00
parent b1384ddafa
commit 62ab360f64
4 changed files with 20 additions and 13 deletions

View File

@ -37,18 +37,18 @@ public class HttpMethodArgumentResolver implements HttpServiceArgumentResolver {
@Override @Override
public void resolve( public boolean resolve(
@Nullable Object argument, MethodParameter parameter, HttpRequestValues.Builder requestValues) { @Nullable Object argument, MethodParameter parameter, HttpRequestValues.Builder requestValues) {
if (argument == null) {
return;
}
if (argument instanceof HttpMethod httpMethod) { if (argument instanceof HttpMethod httpMethod) {
if (logger.isTraceEnabled()) { if (logger.isTraceEnabled()) {
logger.trace("Resolved HTTP method to: " + httpMethod.name()); logger.trace("Resolved HTTP method to: " + httpMethod.name());
} }
requestValues.setHttpMethod(httpMethod); requestValues.setHttpMethod(httpMethod);
return true;
} }
return false;
} }
} }

View File

@ -35,7 +35,8 @@ public interface HttpServiceArgumentResolver {
* @param argument the argument value * @param argument the argument value
* @param parameter the method parameter for the argument * @param parameter the method parameter for the argument
* @param requestValues builder to add HTTP request values to * @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);
} }

View File

@ -30,7 +30,6 @@ import reactor.core.publisher.Mono;
import org.springframework.core.DefaultParameterNameDiscoverer; import org.springframework.core.DefaultParameterNameDiscoverer;
import org.springframework.core.MethodParameter; import org.springframework.core.MethodParameter;
import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.ParameterizedTypeReference;
import org.springframework.core.ReactiveAdapter; import org.springframework.core.ReactiveAdapter;
import org.springframework.core.ReactiveAdapterRegistry; import org.springframework.core.ReactiveAdapterRegistry;
@ -81,9 +80,14 @@ final class HttpServiceMethod {
private static MethodParameter[] initMethodParameters(Method method) { private static MethodParameter[] initMethodParameters(Method method) {
int count = method.getParameterCount(); int count = method.getParameterCount();
if (count == 0) {
return new MethodParameter[0];
}
DefaultParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer();
MethodParameter[] parameters = new MethodParameter[count]; MethodParameter[] parameters = new MethodParameter[count];
for (int i = 0; i < count; i++) { for (int i = 0; i < count; i++) {
parameters[i] = new MethodParameter(method, i); parameters[i] = new MethodParameter(method, i);
parameters[i].initParameterNameDiscovery(nameDiscoverer);
} }
return parameters; return parameters;
} }
@ -103,12 +107,12 @@ final class HttpServiceMethod {
private void applyArguments(HttpRequestValues.Builder requestValues, Object[] arguments) { private void applyArguments(HttpRequestValues.Builder requestValues, Object[] arguments) {
Assert.isTrue(arguments.length == this.parameters.length, "Method argument mismatch"); Assert.isTrue(arguments.length == this.parameters.length, "Method argument mismatch");
for (int i = 0; i < this.parameters.length; i++) { for (int i = 0; i < arguments.length; i++) {
Object argumentValue = arguments[i]; Object value = arguments[i];
ParameterNameDiscoverer nameDiscoverer = new DefaultParameterNameDiscoverer();
this.parameters[i].initParameterNameDiscovery(nameDiscoverer);
for (HttpServiceArgumentResolver resolver : this.argumentResolvers) { for (HttpServiceArgumentResolver resolver : this.argumentResolvers) {
resolver.resolve(argumentValue, this.parameters[i], requestValues); if (resolver.resolve(value, this.parameters[i], requestValues)) {
break;
}
} }
} }
} }

View File

@ -55,12 +55,12 @@ public class PathVariableArgumentResolver implements HttpServiceArgumentResolver
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public void resolve( public boolean resolve(
@Nullable Object argument, MethodParameter parameter, HttpRequestValues.Builder requestValues) { @Nullable Object argument, MethodParameter parameter, HttpRequestValues.Builder requestValues) {
PathVariable annotation = parameter.getParameterAnnotation(PathVariable.class); PathVariable annotation = parameter.getParameterAnnotation(PathVariable.class);
if (annotation == null) { if (annotation == null) {
return; return false;
} }
if (Map.class.isAssignableFrom(parameter.getParameterType())) { 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); Assert.notNull(name, "Failed to determine path variable name for parameter: " + parameter);
addUriParameter(name, argument, annotation.required(), requestValues); addUriParameter(name, argument, annotation.required(), requestValues);
} }
return true;
} }
private void addUriParameter( private void addUriParameter(