Support headers in DataBinding via constructor args

Closes gh-34073
This commit is contained in:
rstoyanchev
2024-12-11 15:10:09 +00:00
parent 7b4e19c69b
commit 70c326ed30
4 changed files with 77 additions and 3 deletions

View File

@@ -156,6 +156,9 @@ public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder {
if (uriVars != null) {
value = uriVars.get(name);
}
if (value == null && getRequest() instanceof HttpServletRequest httpServletRequest) {
value = getHeaderValue(httpServletRequest, name);
}
}
return value;
}
@@ -167,6 +170,13 @@ public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder {
if (uriVars != null) {
set.addAll(uriVars.keySet());
}
if (request instanceof HttpServletRequest httpServletRequest) {
Enumeration<String> enumeration = httpServletRequest.getHeaderNames();
while (enumeration.hasMoreElements()) {
String headerName = enumeration.nextElement();
set.add(headerName.replaceAll("-", ""));
}
}
return set;
}
}

View File

@@ -22,7 +22,10 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.testfixture.beans.TestBean;
import org.springframework.core.ResolvableType;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.BindParam;
import org.springframework.web.bind.support.BindParamNameResolver;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.testfixture.servlet.MockHttpServletRequest;
@@ -45,7 +48,7 @@ class ExtendedServletRequestDataBinderTests {
@Test
void createBinder() {
void createBinderViaSetters() {
request.setAttribute(
HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE,
Map.of("name", "John", "age", "25"));
@@ -62,6 +65,27 @@ class ExtendedServletRequestDataBinderTests {
assertThat(target.getSomeIntArray()).containsExactly(1, 2);
}
@Test
void createBinderViaConstructor() {
request.setAttribute(
HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE,
Map.of("name", "John", "age", "25"));
request.addHeader("Some-Int-Array", "1");
request.addHeader("Some-Int-Array", "2");
ServletRequestDataBinder binder = new ExtendedServletRequestDataBinder(null);
binder.setTargetType(ResolvableType.forClass(DataBean.class));
binder.setNameResolver(new BindParamNameResolver());
binder.construct(request);
DataBean bean = (DataBean) binder.getTarget();
assertThat(bean.name()).isEqualTo("John");
assertThat(bean.age()).isEqualTo(25);
assertThat(bean.someIntArray()).containsExactly(1, 2);
}
@Test
void uriVarsAndHeadersAddedConditionally() {
request.addParameter("name", "John");
@@ -88,4 +112,8 @@ class ExtendedServletRequestDataBinderTests {
assertThat(target.getAge()).isEqualTo(0);
}
private record DataBean(String name, int age, @BindParam("Some-Int-Array") Integer[] someIntArray) {
}
}