Skip to content

Commit 398aae2

Browse files
committed
Polishing in data binding tests
See gh-32676
1 parent 36b0702 commit 398aae2

File tree

4 files changed

+46
-42
lines changed

4 files changed

+46
-42
lines changed

spring-web/src/main/java/org/springframework/web/bind/support/WebExchangeDataBinder.java

+10-4
Original file line numberDiff line numberDiff line change
@@ -148,13 +148,19 @@ public static Mono<Map<String, Object>> extractValuesToBind(ServerWebExchange ex
148148

149149
protected static void addBindValue(Map<String, Object> params, String key, List<?> values) {
150150
if (!CollectionUtils.isEmpty(values)) {
151-
values = values.stream()
152-
.map(value -> value instanceof FormFieldPart formFieldPart ? formFieldPart.value() : value)
153-
.toList();
154-
params.put(key, values.size() == 1 ? values.get(0) : values);
151+
if (values.size() == 1) {
152+
params.put(key, adaptBindValue(values.get(0)));
153+
}
154+
else {
155+
params.put(key, values.stream().map(WebExchangeDataBinder::adaptBindValue).toList());
156+
}
155157
}
156158
}
157159

160+
private static Object adaptBindValue(Object value) {
161+
return (value instanceof FormFieldPart part ? part.value() : value);
162+
}
163+
158164

159165
/**
160166
* Resolve values from a map.

spring-webflux/src/test/java/org/springframework/web/reactive/BindingContextTests.java

+14-21
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,18 @@
1616

1717
package org.springframework.web.reactive;
1818

19+
import java.lang.reflect.Method;
20+
1921
import jakarta.validation.Valid;
2022
import org.junit.jupiter.api.Test;
2123

22-
import org.springframework.core.MethodParameter;
2324
import org.springframework.core.ResolvableType;
2425
import org.springframework.validation.Errors;
2526
import org.springframework.validation.SmartValidator;
2627
import org.springframework.validation.Validator;
2728
import org.springframework.validation.beanvalidation.LocalValidatorFactoryBean;
2829
import org.springframework.web.bind.WebDataBinder;
2930
import org.springframework.web.testfixture.http.server.reactive.MockServerHttpRequest;
30-
import org.springframework.web.testfixture.method.ResolvableMethod;
3131
import org.springframework.web.testfixture.server.MockServerWebExchange;
3232

3333
import static org.assertj.core.api.Assertions.assertThat;
@@ -40,44 +40,37 @@
4040
class BindingContextTests {
4141

4242
@Test
43-
void jakartaValidatorExcludedWhenMethodValidationApplicable() {
43+
void jakartaValidatorExcludedWhenMethodValidationApplicable() throws Exception {
4444
BindingContext bindingContext = new BindingContext(null);
4545
bindingContext.setMethodValidationApplicable(true);
4646

47-
MethodParameter parameter = ResolvableMethod.on(BindingContextTests.class)
48-
.named("handle").build().annotPresent(Valid.class).arg();
47+
Method method = getClass().getDeclaredMethod("handleValidObject", Foo.class);
48+
ResolvableType targetType = ResolvableType.forMethodParameter(method, 0);
4949

50-
WebDataBinder dataBinder = bindingContext.createDataBinder(
51-
MockServerWebExchange.from(MockServerHttpRequest.get("")), new Foo(), "foo",
52-
ResolvableType.forMethodParameter(parameter));
50+
WebDataBinder binder = bindingContext.createDataBinder(
51+
MockServerWebExchange.from(MockServerHttpRequest.get("")), new Foo(), "foo", targetType);
5352

5453
Validator springValidator = mock(Validator.class);
5554
when(springValidator.supports(Foo.class)).thenReturn(true);
56-
dataBinder.addValidators(springValidator);
55+
binder.addValidators(springValidator);
5756

5857
LocalValidatorFactoryBean beanValidator = new LocalValidatorFactoryBean();
5958
beanValidator.afterPropertiesSet();
60-
dataBinder.addValidators(beanValidator);
59+
binder.addValidators(beanValidator);
6160

6261
WrappedBeanValidator wrappedBeanValidator = new WrappedBeanValidator(beanValidator);
63-
dataBinder.addValidators(wrappedBeanValidator);
62+
binder.addValidators(wrappedBeanValidator);
6463

65-
assertThat(dataBinder.getValidatorsToApply()).containsExactly(springValidator);
64+
assertThat(binder.getValidatorsToApply()).containsExactly(springValidator);
6665
}
6766

6867

6968
@SuppressWarnings("unused")
70-
private void handle(@Valid Foo foo) {
69+
private void handleValidObject(@Valid Foo foo) {
7170
}
7271

7372

74-
private static class WrappedBeanValidator implements SmartValidator {
75-
76-
private final jakarta.validation.Validator validator;
77-
78-
private WrappedBeanValidator(jakarta.validation.Validator validator) {
79-
this.validator = validator;
80-
}
73+
private record WrappedBeanValidator(jakarta.validation.Validator validator) implements SmartValidator {
8174

8275
@Override
8376
public boolean supports(Class<?> clazz) {
@@ -100,6 +93,6 @@ public <T> T unwrap(Class<T> type) {
10093
}
10194

10295

103-
private static class Foo {}
96+
private static final class Foo {}
10497

10598
}

spring-webmvc/src/main/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinder.java

+18-13
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2023 the original author or authors.
2+
* Copyright 2002-2024 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -81,24 +81,29 @@ protected ServletRequestValueResolver createValueResolver(ServletRequest request
8181
protected void addBindValues(MutablePropertyValues mpvs, ServletRequest request) {
8282
Map<String, String> uriVars = getUriVars(request);
8383
if (uriVars != null) {
84-
uriVars.forEach((name, value) -> {
85-
if (mpvs.contains(name)) {
86-
if (logger.isDebugEnabled()) {
87-
logger.debug("URI variable '" + name + "' overridden by request bind value.");
88-
}
89-
}
90-
else {
91-
mpvs.addPropertyValue(name, value);
92-
}
93-
});
84+
uriVars.forEach((name, value) -> addValueIfNotPresent(mpvs, "URI variable", name, value));
9485
}
9586
}
9687

9788
@SuppressWarnings("unchecked")
9889
@Nullable
9990
private static Map<String, String> getUriVars(ServletRequest request) {
100-
String attr = HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE;
101-
return (Map<String, String>) request.getAttribute(attr);
91+
return (Map<String, String>) request.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);
92+
}
93+
94+
private static void addValueIfNotPresent(
95+
MutablePropertyValues mpvs, String label, String name, @Nullable Object value) {
96+
97+
if (value != null) {
98+
if (mpvs.contains(name)) {
99+
if (logger.isDebugEnabled()) {
100+
logger.debug(label + " '" + name + "' overridden by request bind value.");
101+
}
102+
}
103+
else {
104+
mpvs.addPropertyValue(name, value);
105+
}
106+
}
102107
}
103108

104109

spring-webmvc/src/test/java/org/springframework/web/servlet/mvc/method/annotation/ExtendedServletRequestDataBinderTests.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ void setup() {
4545

4646
@Test
4747
void createBinder() {
48-
Map<String, String> uriTemplateVars = new HashMap<>();
49-
uriTemplateVars.put("name", "nameValue");
50-
uriTemplateVars.put("age", "25");
51-
request.setAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriTemplateVars);
48+
49+
this.request.setAttribute(
50+
HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE,
51+
Map.of("name", "nameValue", "age", "25"));
5252

5353
TestBean target = new TestBean();
5454
ServletRequestDataBinder binder = new ExtendedServletRequestDataBinder(target, "");

0 commit comments

Comments
 (0)