|
|
|
@ -1,5 +1,5 @@
@@ -1,5 +1,5 @@
|
|
|
|
|
/* |
|
|
|
|
* Copyright 2002-2021 the original author or authors. |
|
|
|
|
* Copyright 2002-2023 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. |
|
|
|
@ -16,7 +16,6 @@
@@ -16,7 +16,6 @@
|
|
|
|
|
|
|
|
|
|
package org.springframework.web.reactive.result.method.annotation; |
|
|
|
|
|
|
|
|
|
import java.net.URISyntaxException; |
|
|
|
|
import java.time.Duration; |
|
|
|
|
import java.util.Map; |
|
|
|
|
import java.util.function.Function; |
|
|
|
@ -112,7 +111,7 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -112,7 +111,7 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void createAndBind() throws Exception { |
|
|
|
|
void createAndBind() { |
|
|
|
|
testBindPojo("pojo", this.testMethod.annotPresent(ModelAttribute.class).arg(Pojo.class), value -> { |
|
|
|
|
assertThat(value.getClass()).isEqualTo(Pojo.class); |
|
|
|
|
return (Pojo) value; |
|
|
|
@ -120,7 +119,7 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -120,7 +119,7 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void createAndBindToMono() throws Exception { |
|
|
|
|
void createAndBindToMono() { |
|
|
|
|
MethodParameter parameter = this.testMethod |
|
|
|
|
.annotNotPresent(ModelAttribute.class).arg(Mono.class, Pojo.class); |
|
|
|
|
|
|
|
|
@ -133,7 +132,7 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -133,7 +132,7 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void createAndBindToSingle() throws Exception { |
|
|
|
|
void createAndBindToSingle() { |
|
|
|
|
MethodParameter parameter = this.testMethod |
|
|
|
|
.annotPresent(ModelAttribute.class).arg(Single.class, Pojo.class); |
|
|
|
|
|
|
|
|
@ -146,7 +145,7 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -146,7 +145,7 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void createButDoNotBind() throws Exception { |
|
|
|
|
void createButDoNotBind() { |
|
|
|
|
MethodParameter parameter = |
|
|
|
|
this.testMethod.annotPresent(ModelAttribute.class).arg(NonBindingPojo.class); |
|
|
|
|
|
|
|
|
@ -157,7 +156,7 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -157,7 +156,7 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void createButDoNotBindToMono() throws Exception { |
|
|
|
|
void createButDoNotBindToMono() { |
|
|
|
|
MethodParameter parameter = |
|
|
|
|
this.testMethod.annotPresent(ModelAttribute.class).arg(Mono.class, NonBindingPojo.class); |
|
|
|
|
|
|
|
|
@ -170,7 +169,7 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -170,7 +169,7 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void createButDoNotBindToSingle() throws Exception { |
|
|
|
|
void createButDoNotBindToSingle() { |
|
|
|
|
MethodParameter parameter = |
|
|
|
|
this.testMethod.annotPresent(ModelAttribute.class).arg(Single.class, NonBindingPojo.class); |
|
|
|
|
|
|
|
|
@ -183,7 +182,7 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -183,7 +182,7 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void createButDoNotBindToPojo(String modelKey, MethodParameter methodParameter, |
|
|
|
|
Function<Object, NonBindingPojo> valueExtractor) throws Exception { |
|
|
|
|
Function<Object, NonBindingPojo> valueExtractor) { |
|
|
|
|
|
|
|
|
|
Object value = createResolver() |
|
|
|
|
.resolveArgument(methodParameter, this.bindContext, postForm("name=Enigma")) |
|
|
|
@ -202,7 +201,7 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -202,7 +201,7 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void bindExisting() throws Exception { |
|
|
|
|
void bindExisting() { |
|
|
|
|
Pojo pojo = new Pojo(); |
|
|
|
|
pojo.setName("Jim"); |
|
|
|
|
this.bindContext.getModel().addAttribute(pojo); |
|
|
|
@ -217,7 +216,7 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -217,7 +216,7 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void bindExistingMono() throws Exception { |
|
|
|
|
void bindExistingMono() { |
|
|
|
|
Pojo pojo = new Pojo(); |
|
|
|
|
pojo.setName("Jim"); |
|
|
|
|
this.bindContext.getModel().addAttribute("pojoMono", Mono.just(pojo)); |
|
|
|
@ -232,7 +231,7 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -232,7 +231,7 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void bindExistingSingle() throws Exception { |
|
|
|
|
void bindExistingSingle() { |
|
|
|
|
Pojo pojo = new Pojo(); |
|
|
|
|
pojo.setName("Jim"); |
|
|
|
|
this.bindContext.getModel().addAttribute("pojoSingle", Single.just(pojo)); |
|
|
|
@ -247,7 +246,7 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -247,7 +246,7 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void bindExistingMonoToMono() throws Exception { |
|
|
|
|
void bindExistingMonoToMono() { |
|
|
|
|
Pojo pojo = new Pojo(); |
|
|
|
|
pojo.setName("Jim"); |
|
|
|
|
String modelKey = "pojoMono"; |
|
|
|
@ -264,8 +263,7 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -264,8 +263,7 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void testBindPojo(String modelKey, MethodParameter param, Function<Object, Pojo> valueExtractor) |
|
|
|
|
throws Exception { |
|
|
|
|
private void testBindPojo(String modelKey, MethodParameter param, Function<Object, Pojo> valueExtractor) { |
|
|
|
|
|
|
|
|
|
Object value = createResolver() |
|
|
|
|
.resolveArgument(param, this.bindContext, postForm("name=Robert&age=25")) |
|
|
|
@ -284,13 +282,13 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -284,13 +282,13 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void validationErrorForPojo() throws Exception { |
|
|
|
|
void validationErrorForPojo() { |
|
|
|
|
MethodParameter parameter = this.testMethod.annotNotPresent(ModelAttribute.class).arg(Pojo.class); |
|
|
|
|
testValidationError(parameter, Function.identity()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void validationErrorForMono() throws Exception { |
|
|
|
|
void validationErrorForMono() { |
|
|
|
|
MethodParameter parameter = this.testMethod |
|
|
|
|
.annotNotPresent(ModelAttribute.class).arg(Mono.class, Pojo.class); |
|
|
|
|
|
|
|
|
@ -303,7 +301,7 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -303,7 +301,7 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void validationErrorForSingle() throws Exception { |
|
|
|
|
void validationErrorForSingle() { |
|
|
|
|
MethodParameter parameter = this.testMethod |
|
|
|
|
.annotPresent(ModelAttribute.class).arg(Single.class, Pojo.class); |
|
|
|
|
|
|
|
|
@ -316,13 +314,13 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -316,13 +314,13 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void validationErrorWithoutBindingForPojo() throws Exception { |
|
|
|
|
void validationErrorWithoutBindingForPojo() { |
|
|
|
|
MethodParameter parameter = this.testMethod.annotPresent(ModelAttribute.class).arg(ValidatedPojo.class); |
|
|
|
|
testValidationErrorWithoutBinding(parameter, Function.identity()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void validationErrorWithoutBindingForMono() throws Exception { |
|
|
|
|
void validationErrorWithoutBindingForMono() { |
|
|
|
|
MethodParameter parameter = this.testMethod.annotPresent(ModelAttribute.class).arg(Mono.class, ValidatedPojo.class); |
|
|
|
|
|
|
|
|
|
testValidationErrorWithoutBinding(parameter, resolvedArgumentMono -> { |
|
|
|
@ -343,20 +341,16 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -343,20 +341,16 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
}); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void testValidationError(MethodParameter parameter, Function<Mono<?>, Mono<?>> valueMonoExtractor) |
|
|
|
|
throws URISyntaxException { |
|
|
|
|
|
|
|
|
|
private void testValidationError(MethodParameter parameter, Function<Mono<?>, Mono<?>> valueMonoExtractor) { |
|
|
|
|
testValidationError(parameter, valueMonoExtractor, "age=invalid", "age", "invalid"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void testValidationErrorWithoutBinding(MethodParameter parameter, Function<Mono<?>, Mono<?>> valueMonoExtractor) |
|
|
|
|
throws URISyntaxException { |
|
|
|
|
|
|
|
|
|
private void testValidationErrorWithoutBinding(MethodParameter parameter, Function<Mono<?>, Mono<?>> valueMonoExtractor) { |
|
|
|
|
testValidationError(parameter, valueMonoExtractor, "name=Enigma", "name", null); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private void testValidationError(MethodParameter param, Function<Mono<?>, Mono<?>> valueMonoExtractor, |
|
|
|
|
String formData, String field, String rejectedValue) throws URISyntaxException { |
|
|
|
|
String formData, String field, String rejectedValue) { |
|
|
|
|
|
|
|
|
|
Mono<?> mono = createResolver().resolveArgument(param, this.bindContext, postForm(formData)); |
|
|
|
|
mono = valueMonoExtractor.apply(mono); |
|
|
|
@ -373,7 +367,7 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -373,7 +367,7 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void bindDataClass() throws Exception { |
|
|
|
|
void bindDataClass() { |
|
|
|
|
MethodParameter parameter = this.testMethod.annotNotPresent(ModelAttribute.class).arg(DataClass.class); |
|
|
|
|
|
|
|
|
|
Object value = createResolver() |
|
|
|
@ -401,7 +395,7 @@ class ModelAttributeMethodArgumentResolverTests {
@@ -401,7 +395,7 @@ class ModelAttributeMethodArgumentResolverTests {
|
|
|
|
|
return new ModelAttributeMethodArgumentResolver(ReactiveAdapterRegistry.getSharedInstance(), false); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private ServerWebExchange postForm(String formData) throws URISyntaxException { |
|
|
|
|
private ServerWebExchange postForm(String formData) { |
|
|
|
|
return MockServerWebExchange.from(MockServerHttpRequest.post("/") |
|
|
|
|
.contentType(MediaType.APPLICATION_FORM_URLENCODED) |
|
|
|
|
.body(formData)); |
|
|
|
|