Add headers to data binding values
Closes gh-32676
This commit is contained in:
@@ -16,10 +16,14 @@
|
||||
|
||||
package org.springframework.web.servlet.mvc.method.annotation;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Enumeration;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import jakarta.servlet.ServletRequest;
|
||||
import jakarta.servlet.http.HttpServletRequest;
|
||||
|
||||
import org.springframework.beans.MutablePropertyValues;
|
||||
import org.springframework.lang.Nullable;
|
||||
@@ -83,6 +87,17 @@ public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder {
|
||||
if (uriVars != null) {
|
||||
uriVars.forEach((name, value) -> addValueIfNotPresent(mpvs, "URI variable", name, value));
|
||||
}
|
||||
if (request instanceof HttpServletRequest httpRequest) {
|
||||
Enumeration<String> names = httpRequest.getHeaderNames();
|
||||
while (names.hasMoreElements()) {
|
||||
String name = names.nextElement();
|
||||
Object value = getHeaderValue(httpRequest, name);
|
||||
if (value != null) {
|
||||
name = name.replace("-", "");
|
||||
addValueIfNotPresent(mpvs, "Header", name, value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
@@ -91,19 +106,35 @@ public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder {
|
||||
return (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
|
||||
}
|
||||
|
||||
private static void addValueIfNotPresent(
|
||||
MutablePropertyValues mpvs, String label, String name, @Nullable Object value) {
|
||||
|
||||
if (value != null) {
|
||||
if (mpvs.contains(name)) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug(label + " '" + name + "' overridden by request bind value.");
|
||||
}
|
||||
}
|
||||
else {
|
||||
mpvs.addPropertyValue(name, value);
|
||||
private static void addValueIfNotPresent(MutablePropertyValues mpvs, String label, String name, Object value) {
|
||||
if (mpvs.contains(name)) {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug(label + " '" + name + "' overridden by request bind value.");
|
||||
}
|
||||
}
|
||||
else {
|
||||
mpvs.addPropertyValue(name, value);
|
||||
}
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static Object getHeaderValue(HttpServletRequest request, String name) {
|
||||
Enumeration<String> valuesEnum = request.getHeaders(name);
|
||||
if (!valuesEnum.hasMoreElements()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String value = valuesEnum.nextElement();
|
||||
if (!valuesEnum.hasMoreElements()) {
|
||||
return value;
|
||||
}
|
||||
|
||||
List<Object> values = new ArrayList<>();
|
||||
values.add(value);
|
||||
while (valuesEnum.hasMoreElements()) {
|
||||
values.add(valuesEnum.nextElement());
|
||||
}
|
||||
return values;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
|
||||
package org.springframework.web.servlet.mvc.method.annotation;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
import org.junit.jupiter.api.BeforeEach;
|
||||
@@ -38,41 +37,45 @@ class ExtendedServletRequestDataBinderTests {
|
||||
|
||||
private MockHttpServletRequest request;
|
||||
|
||||
|
||||
@BeforeEach
|
||||
void setup() {
|
||||
this.request = new MockHttpServletRequest();
|
||||
}
|
||||
|
||||
|
||||
@Test
|
||||
void createBinder() {
|
||||
|
||||
this.request.setAttribute(
|
||||
request.setAttribute(
|
||||
HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE,
|
||||
Map.of("name", "nameValue", "age", "25"));
|
||||
Map.of("name", "John", "age", "25"));
|
||||
|
||||
request.addHeader("Some-Int-Array", "1");
|
||||
request.addHeader("Some-Int-Array", "2");
|
||||
|
||||
TestBean target = new TestBean();
|
||||
ServletRequestDataBinder binder = new ExtendedServletRequestDataBinder(target, "");
|
||||
binder.bind(request);
|
||||
|
||||
assertThat(target.getName()).isEqualTo("nameValue");
|
||||
assertThat(target.getName()).isEqualTo("John");
|
||||
assertThat(target.getAge()).isEqualTo(25);
|
||||
assertThat(target.getSomeIntArray()).containsExactly(1, 2);
|
||||
}
|
||||
|
||||
@Test
|
||||
void uriTemplateVarAndRequestParam() {
|
||||
request.addParameter("age", "35");
|
||||
void uriVarsAndHeadersAddedConditionally() {
|
||||
request.addParameter("name", "John");
|
||||
request.addParameter("age", "25");
|
||||
|
||||
Map<String, String> uriTemplateVars = new HashMap<>();
|
||||
uriTemplateVars.put("name", "nameValue");
|
||||
uriTemplateVars.put("age", "25");
|
||||
request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriTemplateVars);
|
||||
request.addHeader("name", "Johnny");
|
||||
request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, Map.of("age", "26"));
|
||||
|
||||
TestBean target = new TestBean();
|
||||
ServletRequestDataBinder binder = new ExtendedServletRequestDataBinder(target, "");
|
||||
binder.bind(request);
|
||||
|
||||
assertThat(target.getName()).isEqualTo("nameValue");
|
||||
assertThat(target.getAge()).isEqualTo(35);
|
||||
assertThat(target.getName()).isEqualTo("John");
|
||||
assertThat(target.getAge()).isEqualTo(25);
|
||||
}
|
||||
|
||||
@Test
|
||||
|
||||
Reference in New Issue
Block a user