Minor refactoring in AbstractNamedValueArgumentResolver

Expose MethodParameter information in abstract protected method that
adds the HTTP request value.

See gh-29420
This commit is contained in:
rstoyanchev
2022-11-02 12:33:58 +00:00
parent 723e09c164
commit 4b647a1801
8 changed files with 57 additions and 21 deletions

View File

@@ -18,6 +18,7 @@ package org.springframework.web.service.invoker;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
@@ -83,10 +84,12 @@ public abstract class AbstractNamedValueArgumentResolver implements HttpServiceA
if (Map.class.isAssignableFrom(parameter.getParameterType())) {
Assert.isInstanceOf(Map.class, argument);
parameter = parameter.nested(1);
argument = (argument != null ? argument : Collections.emptyMap());
for (Map.Entry<String, ?> entry : ((Map<String, ?>) argument).entrySet()) {
addSingleOrMultipleValues(
entry.getKey(), entry.getValue(), false, null, info.label, info.multiValued,
null, requestValues);
parameter, requestValues);
}
}
else {
@@ -136,17 +139,20 @@ public abstract class AbstractNamedValueArgumentResolver implements HttpServiceA
private void addSingleOrMultipleValues(
String name, @Nullable Object value, boolean required, @Nullable Object defaultValue,
String valueLabel, boolean supportsMultiValues, @Nullable MethodParameter parameter,
String valueLabel, boolean supportsMultiValues, MethodParameter parameter,
HttpRequestValues.Builder requestValues) {
if (supportsMultiValues) {
value = (ObjectUtils.isArray(value) ? Arrays.asList((Object[]) value) : value);
if (ObjectUtils.isArray(value)) {
value = Arrays.asList((Object[]) value);
}
if (value instanceof Collection<?> elements) {
parameter = parameter.nested();
boolean hasValues = false;
for (Object element : elements) {
if (element != null) {
hasValues = true;
addSingleValue(name, element, false, null, valueLabel, null, requestValues);
addSingleValue(name, element, false, null, valueLabel, parameter, requestValues);
}
}
if (hasValues) {
@@ -160,8 +166,8 @@ public abstract class AbstractNamedValueArgumentResolver implements HttpServiceA
}
private void addSingleValue(
String name, @Nullable Object value, boolean required, @Nullable Object defaultValue, String valueLabel,
@Nullable MethodParameter parameter, HttpRequestValues.Builder requestValues) {
String name, @Nullable Object value, boolean required, @Nullable Object defaultValue,
String valueLabel, MethodParameter parameter, HttpRequestValues.Builder requestValues) {
if (value instanceof Optional<?> optionalValue) {
value = optionalValue.orElse(null);
@@ -172,13 +178,11 @@ public abstract class AbstractNamedValueArgumentResolver implements HttpServiceA
}
if (this.conversionService != null && !(value instanceof String)) {
parameter = (parameter != null ? parameter.nestedIfOptional() : null);
if (parameter != null && parameter.getNestedParameterType() != Object.class) {
value = this.conversionService.convert(value, new TypeDescriptor(parameter), STRING_TARGET_TYPE);
}
else {
value = this.conversionService.convert(value, String.class);
}
parameter = parameter.nestedIfOptional();
Class<?> type = parameter.getNestedParameterType();
value = (type != Object.class && !type.isArray() ?
this.conversionService.convert(value, new TypeDescriptor(parameter), STRING_TARGET_TYPE) :
this.conversionService.convert(value, String.class));
}
if (value == null) {
@@ -190,7 +194,7 @@ public abstract class AbstractNamedValueArgumentResolver implements HttpServiceA
logger.trace("Resolved " + valueLabel + " value '" + name + ":" + value + "'");
}
addRequestValue(name, value, requestValues);
addRequestValue(name, value, parameter, requestValues);
}
/**
@@ -200,9 +204,11 @@ public abstract class AbstractNamedValueArgumentResolver implements HttpServiceA
* will have been converted to a String and may be cast down.
* @param name the request value name
* @param value the value
* @param parameter the method parameter type, nested if Map, List/array, or Optional
* @param requestValues builder to add the request value to
*/
protected abstract void addRequestValue(String name, Object value, HttpRequestValues.Builder requestValues);
protected abstract void addRequestValue(
String name, Object value, MethodParameter parameter, HttpRequestValues.Builder requestValues);
/**

View File

@@ -63,7 +63,9 @@ public class CookieValueArgumentResolver extends AbstractNamedValueArgumentResol
}
@Override
protected void addRequestValue(String name, Object value, HttpRequestValues.Builder requestValues) {
protected void addRequestValue(
String name, Object value, MethodParameter parameter, HttpRequestValues.Builder requestValues) {
requestValues.addCookie(name, (String) value);
}

View File

@@ -55,7 +55,9 @@ public class PathVariableArgumentResolver extends AbstractNamedValueArgumentReso
}
@Override
protected void addRequestValue(String name, Object value, HttpRequestValues.Builder requestValues) {
protected void addRequestValue(
String name, Object value, MethodParameter parameter, HttpRequestValues.Builder requestValues) {
requestValues.setUriVariable(name, (String) value);
}

View File

@@ -47,7 +47,9 @@ public class RequestAttributeArgumentResolver extends AbstractNamedValueArgument
}
@Override
protected void addRequestValue(String name, Object value, HttpRequestValues.Builder requestValues) {
protected void addRequestValue(
String name, Object value, MethodParameter parameter, HttpRequestValues.Builder requestValues) {
requestValues.addAttribute(name, value);
}

View File

@@ -64,7 +64,9 @@ public class RequestHeaderArgumentResolver extends AbstractNamedValueArgumentRes
}
@Override
protected void addRequestValue(String name, Object value, HttpRequestValues.Builder requestValues) {
protected void addRequestValue(
String name, Object value, MethodParameter parameter, HttpRequestValues.Builder requestValues) {
requestValues.addHeader(name, (String) value);
}

View File

@@ -67,7 +67,9 @@ public class RequestParamArgumentResolver extends AbstractNamedValueArgumentReso
}
@Override
protected void addRequestValue(String name, Object value, HttpRequestValues.Builder requestValues) {
protected void addRequestValue(
String name, Object value, MethodParameter parameter, HttpRequestValues.Builder requestValues) {
requestValues.addRequestParameter(name, (String) value);
}