diff --git a/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractNamedValueMethodArgumentResolver.java b/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractNamedValueMethodArgumentResolver.java index 703362d31e88..28731fa2d431 100644 --- a/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractNamedValueMethodArgumentResolver.java +++ b/spring-web/src/main/java/org/springframework/web/method/annotation/AbstractNamedValueMethodArgumentResolver.java @@ -123,6 +123,11 @@ else if ("".equals(arg) && namedValueInfo.defaultValue != null) { WebDataBinder binder = binderFactory.createBinder(webRequest, null, namedValueInfo.name); try { arg = binder.convertIfNecessary(arg, parameter.getParameterType(), parameter); + if (arg == null && namedValueInfo.defaultValue != null) { + arg = binder.convertIfNecessary( + resolveEmbeddedValuesAndExpressions(namedValueInfo.defaultValue), + parameter.getParameterType(), parameter); + } } catch (ConversionNotSupportedException ex) { throw new MethodArgumentConversionNotSupportedException(arg, ex.getRequiredType(), diff --git a/spring-web/src/test/java/org/springframework/web/method/annotation/RequestParamMethodArgumentResolverTests.java b/spring-web/src/test/java/org/springframework/web/method/annotation/RequestParamMethodArgumentResolverTests.java index 9594f24c674e..217113bb924f 100644 --- a/spring-web/src/test/java/org/springframework/web/method/annotation/RequestParamMethodArgumentResolverTests.java +++ b/spring-web/src/test/java/org/springframework/web/method/annotation/RequestParamMethodArgumentResolverTests.java @@ -79,6 +79,9 @@ public void supportsParameter() { MethodParameter param = this.testMethod.annot(requestParam().notRequired("bar")).arg(String.class); assertThat(resolver.supportsParameter(param)).isTrue(); + param = this.testMethod.annotPresent(RequestParam.class).arg(Integer.class); + assertThat(resolver.supportsParameter(param)).isTrue(); + param = this.testMethod.annotPresent(RequestParam.class).arg(String[].class); assertThat(resolver.supportsParameter(param)).isTrue(); @@ -504,6 +507,20 @@ public void resolveEmptyValueRequiredWithoutDefault() throws Exception { assertThat(result).isEqualTo(""); } + @Test + public void resolveBlankValueToDefault() throws Exception { + ConfigurableWebBindingInitializer initializer = new ConfigurableWebBindingInitializer(); + initializer.setConversionService(new DefaultConversionService()); + WebDataBinderFactory binderFactory = new DefaultDataBinderFactory(initializer); + + request.addParameter("name", " "); + MethodParameter param = this.testMethod.annotPresent(RequestParam.class).arg(Integer.class); + Object result = resolver.resolveArgument(param, null, webRequest, binderFactory); + boolean condition = result instanceof Integer; + assertThat(condition).isTrue(); + assertThat(result).isEqualTo(20); + } + @Test @SuppressWarnings({ "rawtypes", "unchecked" }) public void resolveOptionalParamValue() throws Exception { @@ -662,6 +679,7 @@ public void handle( @RequestParam("pfilelist") List param8, @RequestParam("pfilearray") Part[] param9, @RequestParam Map param10, + @RequestParam(name = "name", defaultValue = "20") Integer param11, String stringNotAnnot, MultipartFile multipartFileNotAnnot, List multipartFileList,