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
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;
}
}

View File

@ -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);
}

View File

@ -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;
}
}
}
}

View File

@ -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(