diff --git a/spring-context/src/main/java/org/springframework/validation/DataBinder.java b/spring-context/src/main/java/org/springframework/validation/DataBinder.java index 274331a89c..086baefad9 100644 --- a/spring-context/src/main/java/org/springframework/validation/DataBinder.java +++ b/spring-context/src/main/java/org/springframework/validation/DataBinder.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2024 the original author or authors. + * Copyright 2002-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -1412,6 +1412,9 @@ public class DataBinder implements PropertyEditorRegistry, TypeConverter { /** * Return the names of all property values. + *

Useful for proactive checks whether there are property values nested + * further below the path for a constructor arg. If not then the + * constructor arg can be considered missing and not to be instantiated. * @since 6.1.2 */ Set getNames(); 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 648be6b30c..b0acd640ae 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 @@ -125,7 +125,7 @@ public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder { String name = names.nextElement(); Object value = getHeaderValue(httpRequest, name); if (value != null) { - name = StringUtils.uncapitalize(name.replace("-", "")); + name = normalizeHeaderName(name); addValueIfNotPresent(mpvs, "Header", name, value); } } @@ -173,6 +173,10 @@ public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder { return values; } + private static String normalizeHeaderName(String name) { + return StringUtils.uncapitalize(name.replace("-", "")); + } + /** * Resolver of values that looks up URI path variables. @@ -209,8 +213,10 @@ public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder { if (request instanceof HttpServletRequest httpServletRequest) { Enumeration enumeration = httpServletRequest.getHeaderNames(); while (enumeration.hasMoreElements()) { - String headerName = enumeration.nextElement(); - set.add(headerName.replaceAll("-", "")); + String name = enumeration.nextElement(); + if (headerPredicate.test(name)) { + set.add(normalizeHeaderName(name)); + } } } 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 02dc565699..3164fba945 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 @@ -119,6 +119,23 @@ class ExtendedServletRequestDataBinderTests { assertThat(mpvs).isEmpty(); } + @Test + void headerPredicateWithConstructorArgs() { + ExtendedServletRequestDataBinder binder = new ExtendedServletRequestDataBinder(null); + binder.addHeaderPredicate(name -> !name.equalsIgnoreCase("Some-Int-Array")); + binder.setTargetType(ResolvableType.forClass(DataBean.class)); + binder.setNameResolver(new BindParamNameResolver()); + + request.addHeader("Some-Int-Array", "1"); + request.addHeader("Some-Int-Array", "2"); + + binder.construct(request); + + DataBean bean = (DataBean) binder.getTarget(); + + assertThat(bean.someIntArray()).isNull(); + } + @Test void headerPredicate() { TestBinder binder = new TestBinder();