Skip to content

Commit b98c1ec

Browse files
committed
Apply default value in case of null after conversion
Closes gh-29550
1 parent 37ff979 commit b98c1ec

File tree

4 files changed

+36
-9
lines changed

4 files changed

+36
-9
lines changed

spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/reactive/AbstractNamedValueMethodArgumentResolver.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -108,9 +108,13 @@ else if ("".equals(arg) && namedValueInfo.defaultValue != null) {
108108
if (parameter != nestedParameter || !ClassUtils.isAssignableValue(parameter.getParameterType(), arg)) {
109109
arg = this.conversionService.convert(arg, TypeDescriptor.forObject(arg), new TypeDescriptor(parameter));
110110
// Check for null value after conversion of incoming argument value
111-
if (arg == null && namedValueInfo.defaultValue == null &&
112-
namedValueInfo.required && !nestedParameter.isOptional()) {
113-
handleMissingValue(namedValueInfo.name, nestedParameter, message);
111+
if (arg == null) {
112+
if (namedValueInfo.defaultValue != null) {
113+
arg = resolveEmbeddedValuesAndExpressions(namedValueInfo.defaultValue);
114+
}
115+
else if (namedValueInfo.required && !nestedParameter.isOptional()) {
116+
handleMissingValue(namedValueInfo.name, nestedParameter, message);
117+
}
114118
}
115119
}
116120

spring-messaging/src/main/java/org/springframework/messaging/handler/annotation/support/AbstractNamedValueMethodArgumentResolver.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,13 @@ else if ("".equals(arg) && namedValueInfo.defaultValue != null) {
116116
if (parameter != nestedParameter || !ClassUtils.isAssignableValue(parameter.getParameterType(), arg)) {
117117
arg = this.conversionService.convert(arg, TypeDescriptor.forObject(arg), new TypeDescriptor(parameter));
118118
// Check for null value after conversion of incoming argument value
119-
if (arg == null && namedValueInfo.defaultValue == null &&
120-
namedValueInfo.required && !nestedParameter.isOptional()) {
121-
handleMissingValue(namedValueInfo.name, nestedParameter, message);
119+
if (arg == null) {
120+
if (namedValueInfo.defaultValue != null) {
121+
arg = resolveEmbeddedValuesAndExpressions(namedValueInfo.defaultValue);
122+
}
123+
else if (namedValueInfo.required && !nestedParameter.isOptional()) {
124+
handleMissingValue(namedValueInfo.name, nestedParameter, message);
125+
}
122126
}
123127
}
124128

spring-web/src/main/java/org/springframework/web/method/annotation/AbstractNamedValueMethodArgumentResolver.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -133,9 +133,13 @@ else if ("".equals(arg) && namedValueInfo.defaultValue != null) {
133133
namedValueInfo.name, parameter, ex.getCause());
134134
}
135135
// Check for null value after conversion of incoming argument value
136-
if (arg == null && namedValueInfo.defaultValue == null &&
137-
namedValueInfo.required && !nestedParameter.isOptional()) {
138-
handleMissingValueAfterConversion(namedValueInfo.name, nestedParameter, webRequest);
136+
if (arg == null) {
137+
if (namedValueInfo.defaultValue != null) {
138+
arg = resolveEmbeddedValuesAndExpressions(namedValueInfo.defaultValue);
139+
}
140+
else if (namedValueInfo.required && !nestedParameter.isOptional()) {
141+
handleMissingValueAfterConversion(namedValueInfo.name, nestedParameter, webRequest);
142+
}
139143
}
140144
}
141145

spring-web/src/test/java/org/springframework/web/method/annotation/RequestParamMethodArgumentResolverTests.java

+15
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,21 @@ public void missingRequestParamEmptyValueNotRequired() throws Exception {
462462
assertThat(arg).isNull();
463463
}
464464

465+
@Test // gh-29550
466+
public void missingRequestParamEmptyValueNotRequiredWithDefaultValue() throws Exception {
467+
WebDataBinder binder = new WebRequestDataBinder(null);
468+
binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
469+
470+
WebDataBinderFactory binderFactory = mock();
471+
given(binderFactory.createBinder(webRequest, null, "name")).willReturn(binder);
472+
473+
request.addParameter("name", " ");
474+
475+
MethodParameter param = this.testMethod.annot(requestParam().notRequired("bar")).arg(String.class);
476+
Object arg = resolver.resolveArgument(param, null, webRequest, binderFactory);
477+
assertThat(arg).isEqualTo("bar");
478+
}
479+
465480
@Test
466481
public void resolveSimpleTypeParam() throws Exception {
467482
request.setParameter("stringNotAnnot", "plainValue");

0 commit comments

Comments
 (0)