Refine @PageableDefault and @SortDefault annotations.

We now use MergedAnnotations to evaluate annotation attributes and to use aliasing across attributes. Also, SortDefault is not repeatable.

Closes #2657
This commit is contained in:
Mark Paluch
2022-07-27 09:45:28 +02:00
parent 3a6b04dfe1
commit 7e1712a5de
10 changed files with 71 additions and 68 deletions

View File

@@ -96,7 +96,7 @@ abstract class PageableDefaultUnitTests {
}
@Test
void rejectsInvalidQulifiers() throws Exception {
void rejectsInvalidQualifiers() {
var parameter = TestUtils.getParameterOfMethod(getControllerClass(), "invalidQualifiers",
Pageable.class, Pageable.class);
@@ -110,7 +110,7 @@ abstract class PageableDefaultUnitTests {
}
@Test
void rejectsNoQualifiers() throws Exception {
void rejectsNoQualifiers() {
var parameter = TestUtils.getParameterOfMethod(getControllerClass(), "noQualifiers", Pageable.class,
Pageable.class);

View File

@@ -36,6 +36,7 @@ import org.springframework.web.context.request.ServletWebRequest;
* @author Oliver Gierke
* @author Nick Williams
* @author Vedran Pavic
* @author Mark Paluch
*/
class PageableHandlerMethodArgumentResolverUnitTests extends PageableDefaultUnitTests {
@@ -106,13 +107,20 @@ class PageableHandlerMethodArgumentResolverUnitTests extends PageableDefaultUnit
@Test // DATACMNS-377
void rejectsInvalidCustomDefaultForPageSize() throws Exception {
var parameter = new MethodParameter(Sample.class.getMethod("invalidDefaultPageSize", Pageable.class),
0);
var parameter = new MethodParameter(Sample.class.getMethod("invalidDefaultPageSize", Pageable.class), 0);
assertThatIllegalStateException().isThrownBy(() -> assertSupportedAndResult(parameter, DEFAULT_PAGE_REQUEST)) //
.withMessageContaining("invalidDefaultPageSize");
}
@Test // GH-2657
void considersValueAlias() throws Exception {
var parameter = new MethodParameter(Sample.class.getMethod("valuePageSize", Pageable.class), 0);
assertSupportedAndResult(parameter, PageRequest.of(0, 2));
}
@Test // DATACMNS-408
void fallsBackToFirstPageIfNegativePageNumberIsGiven() throws Exception {
@@ -289,6 +297,8 @@ class PageableHandlerMethodArgumentResolverUnitTests extends PageableDefaultUnit
void invalidDefaultPageSize(@PageableDefault(size = 0) Pageable pageable);
void valuePageSize(@PageableDefault(2) Pageable pageable);
void simpleDefault(@PageableDefault(size = PAGE_SIZE, page = PAGE_NUMBER) Pageable pageable);
void simpleDefaultWithSort(

View File

@@ -153,20 +153,9 @@ class ReactiveSortHandlerMethodArgumentResolverUnitTests {
assertThat(resolve(request, PARAMETER)).isEqualTo(Sort.by(DESC, "property1"));
}
@Test // DATACMNS-1211
void rejectsDoubleAnnotatedMethod() {
var parameter = getParameterOfMethod("invalid");
var resolver = new ReactiveSortHandlerMethodArgumentResolver();
assertThat(resolver.supportsParameter(parameter)).isTrue();
assertThatIllegalArgumentException()
.isThrownBy(() ->
resolver.resolveArgumentValue(parameter, null,
MockServerWebExchange.from(TestUtils.getWebfluxRequest())))
.withMessageContaining(SortDefault.class.getSimpleName())
.withMessageContaining(SortDefaults.class.getSimpleName()).withMessageContaining(parameter.toString());
@Test // GH-2657
void considersRepeatableAnnotation() {
assertSupportedAndResolvedTo(getParameterOfMethod("repeatable"), Sort.by("one", "two", "three").ascending());
}
@Test // DATACMNS-1211
@@ -261,6 +250,6 @@ class ReactiveSortHandlerMethodArgumentResolverUnitTests {
void containeredDefault(@SortDefaults(@SortDefault({ "foo", "bar" })) Sort sort);
void invalid(@SortDefaults(@SortDefault({ "foo", "bar" })) @SortDefault({ "bar", "foo" }) Sort sort);
void repeatable(@SortDefault({ "one", "two" }) @SortDefault({ "three" }) Sort sort);
}
}

View File

@@ -25,7 +25,6 @@ import org.springframework.core.MethodParameter;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order;
import org.springframework.data.web.SortDefault.SortDefaults;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
/**
@@ -91,19 +90,9 @@ abstract class SortDefaultUnitTests {
assertThat(getResolver().supportsParameter(parameter)).isFalse();
}
@Test
void rejectsDoubleAnnotatedMethod() {
var parameter = getParameterOfMethod("invalid");
HandlerMethodArgumentResolver resolver = new SortHandlerMethodArgumentResolver();
assertThat(resolver.supportsParameter(parameter)).isTrue();
assertThatIllegalArgumentException()
.isThrownBy(() -> resolver.resolveArgument(parameter, null, TestUtils.getWebRequest(), null)) //
.withMessageContaining(SortDefault.class.getSimpleName()) //
.withMessageContaining(SortDefaults.class.getSimpleName()) //
.withMessageContaining(parameter.toString());
@Test // GH-2657
void considersRepeatableAnnotation() throws Exception {
assertSupportedAndResolvedTo(getParameterOfMethod("repeatable"), Sort.by("one", "two", "three").ascending());
}
@Test

View File

@@ -324,7 +324,7 @@ class SortHandlerMethodArgumentResolverUnitTests extends SortDefaultUnitTests {
void containeredDefault(@SortDefaults(@SortDefault({ "foo", "bar" })) Sort sort);
void invalid(@SortDefaults(@SortDefault({ "foo", "bar" })) @SortDefault({ "bar", "foo" }) Sort sort);
void repeatable(@SortDefault({ "one", "two" }) @SortDefault({ "three" }) Sort sort);
void emptyQualifier(@Qualifier Sort sort);