diff --git a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinder.java b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinder.java index 352862fb0e63..d3ea0821605f 100644 --- a/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinder.java +++ b/spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinder.java @@ -124,7 +124,7 @@ protected void addBindValues(MutablePropertyValues mpvs, ServletRequest request) String name = names.nextElement(); Object value = getHeaderValue(httpRequest, name); if (value != null) { - name = StringUtils.uncapitalize(name.replace("-", "")); + name = transformedHeaderName(name); addValueIfNotPresent(mpvs, "Header", name, value); } } @@ -147,6 +147,10 @@ private static void addValueIfNotPresent(MutablePropertyValues mpvs, String labe } } + private static String transformedHeaderName(String headerName) { + return StringUtils.uncapitalize(headerName.replace("-", "")); + } + private @Nullable Object getHeaderValue(HttpServletRequest request, String name) { if (!this.headerPredicate.test(name)) { return null; @@ -206,7 +210,7 @@ protected Set initParameterNames(ServletRequest request) { Enumeration enumeration = httpServletRequest.getHeaderNames(); while (enumeration.hasMoreElements()) { String headerName = enumeration.nextElement(); - set.add(headerName.replaceAll("-", "")); + set.add(headerName); } } return set; diff --git a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java index 1d7653bdf5af..70c9b87a90dd 100644 --- a/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java +++ b/spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java @@ -88,6 +88,30 @@ void createBinderViaConstructor() { assertThat(bean.someIntArray()).containsExactly(1, 2); } + @Test + void createBinderViaConstructorNested() { + request.addHeader("Nested-Test-Bean.Some-Int-Array", "1"); + request.addHeader("Nested-Test-Bean.Some-Int-Array", "2"); + + ServletRequestDataBinder binder = new ExtendedServletRequestDataBinder(null); + binder.setTargetType(ResolvableType.forClass(SimpleBean.class)); + binder.setNameResolver(new BindParamNameResolver()); + binder.construct(request); + + SimpleBean bean = (SimpleBean) binder.getTarget(); + + assertThat(bean.nestedTestBean()).isNotNull(); + assertThat(bean.nestedTestBean().someIntArray()).containsExactly(1, 2); + } + + private record SimpleBean(@BindParam("Nested-Test-Bean") NestedTestBean nestedTestBean) { + + } + + private record NestedTestBean(@BindParam("Some-Int-Array") Integer[] someIntArray) { + + } + @Test void uriVarsAndHeadersAddedConditionally() { request.addParameter("name", "John");