WebFlux supports field default/marker parameters for data classes as well

Issue: SPR-15871
This commit is contained in:
Juergen Hoeller 2017-09-08 16:55:12 +02:00
parent cf106ec99e
commit 496223a927
2 changed files with 20 additions and 4 deletions

View File

@ -112,7 +112,7 @@ public class ModelAttributeMethodArgumentResolver extends HandlerMethodArgumentR
ResolvableType valueType = (adapter != null ? type.getGeneric() : type);
Assert.state(adapter == null || !adapter.isMultiValue(),
() -> getClass().getSimpleName() + " doesn't support multi-value reactive type wrapper: " +
() -> getClass().getSimpleName() + " does not support multi-value reactive type wrapper: " +
parameter.getGenericParameterType());
String name = getAttributeName(parameter);
@ -169,7 +169,7 @@ public class ModelAttributeMethodArgumentResolver extends HandlerMethodArgumentR
if (attribute == null) {
Class<?> attributeClass = attributeType.getRawClass();
Assert.state(attributeClass != null, "No attribute class");
return createAttribute(attributeName,attributeClass , context, exchange);
return createAttribute(attributeName, attributeClass, context, exchange);
}
ReactiveAdapter adapterFrom = getAdapterRegistry().getAdapter(null, attribute);
@ -230,9 +230,23 @@ public class ModelAttributeMethodArgumentResolver extends HandlerMethodArgumentR
() -> "Invalid number of parameter names: " + paramNames.length + " for constructor " + ctor);
Object[] args = new Object[paramTypes.length];
WebDataBinder binder = context.createDataBinder(exchange, null, attributeName);
String fieldDefaultPrefix = binder.getFieldDefaultPrefix();
String fieldMarkerPrefix = binder.getFieldMarkerPrefix();
for (int i = 0; i < paramNames.length; i++) {
Object value = bindValues.get(paramNames[i]);
value = (value != null && value instanceof List ? ((List<?>) value).toArray() : value);
String paramName = paramNames[i];
Class<?> paramType = paramTypes[i];
Object value = bindValues.get(paramName);
if (value == null) {
if (fieldDefaultPrefix != null) {
value = bindValues.get(fieldDefaultPrefix + paramName);
}
if (value == null && fieldMarkerPrefix != null) {
if (bindValues.get(fieldMarkerPrefix + paramName) != null) {
value = binder.getEmptyValue(paramType);
}
}
}
value = (value instanceof List ? ((List<?>) value).toArray() : value);
args[i] = binder.convertIfNecessary(value, paramTypes[i], new MethodParameter(ctor, i));
}
return BeanUtils.instantiateClass(ctor, args);

View File

@ -301,6 +301,8 @@ public class ModelAttributeMethodArgumentResolverTests {
assertTrue(map.get(bindingResultKey) instanceof BindingResult);
}
// TODO: SPR-15871, SPR-15542
private ModelAttributeMethodArgumentResolver createResolver() {
return new ModelAttributeMethodArgumentResolver(new ReactiveAdapterRegistry(), false);