Skip to content

Commit f9a776b

Browse files
vpavicmp911de
authored andcommitted
DATACMNS-1827 - Consider Qualifier meta-annotated Sort method parameters.
Original pull request: #474.
1 parent 80c63f7 commit f9a776b

File tree

4 files changed

+82
-5
lines changed

4 files changed

+82
-5
lines changed

src/main/java/org/springframework/data/web/SortHandlerMethodArgumentResolverSupport.java

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@
2222
import java.util.Optional;
2323
import java.util.function.Consumer;
2424

25-
import javax.annotation.Nullable;
26-
2725
import org.springframework.beans.factory.annotation.Qualifier;
2826
import org.springframework.core.MethodParameter;
27+
import org.springframework.core.annotation.MergedAnnotation;
28+
import org.springframework.core.annotation.MergedAnnotations;
2929
import org.springframework.data.domain.Sort;
3030
import org.springframework.data.domain.Sort.Direction;
3131
import org.springframework.data.domain.Sort.Order;
3232
import org.springframework.data.web.SortDefault.SortDefaults;
33+
import org.springframework.lang.Nullable;
3334
import org.springframework.util.Assert;
3435
import org.springframework.util.StringUtils;
3536

@@ -41,6 +42,7 @@
4142
* @see SortHandlerMethodArgumentResolver
4243
* @see ReactiveSortHandlerMethodArgumentResolver
4344
* @author Mark Paluch
45+
* @author Vedran Pavic
4446
*/
4547
public abstract class SortHandlerMethodArgumentResolverSupport {
4648

@@ -184,10 +186,10 @@ protected String getSortParameter(@Nullable MethodParameter parameter) {
184186

185187
StringBuilder builder = new StringBuilder();
186188

187-
Qualifier qualifier = parameter != null ? parameter.getParameterAnnotation(Qualifier.class) : null;
189+
String value = getQualifier(parameter);
188190

189-
if (qualifier != null && StringUtils.hasLength(qualifier.value())) {
190-
builder.append(qualifier.value());
191+
if (StringUtils.hasLength(value)) {
192+
builder.append(value);
191193
builder.append(qualifierDelimiter);
192194
}
193195

@@ -293,6 +295,19 @@ static boolean notOnlyDots(String source) {
293295
return StringUtils.hasText(source.replace(".", ""));
294296
}
295297

298+
@Nullable
299+
private static String getQualifier(@Nullable MethodParameter parameter) {
300+
301+
if (parameter == null) {
302+
return null;
303+
}
304+
305+
MergedAnnotations annotations = MergedAnnotations.from(parameter.getParameter());
306+
MergedAnnotation<Qualifier> qualifier = annotations.get(Qualifier.class);
307+
308+
return qualifier.isPresent() ? qualifier.getString("value") : null;
309+
}
310+
296311
/**
297312
* Helper to easily build request parameter expressions for {@link Sort} instances.
298313
*

src/test/java/org/springframework/data/web/PageableHandlerMethodArgumentResolverUnitTests.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,18 @@ void emptyQualifierIsUsedInParameterLookup() throws Exception {
257257
assertSupportedAndResult(parameter, PageRequest.of(2, 10), request);
258258
}
259259

260+
@Test // DATACMNS-1827
261+
void mergedQualifierIsUsedInParameterLookup() throws Exception {
262+
263+
MethodParameter parameter = new MethodParameter(Sample.class.getMethod("mergedQualifier", Pageable.class), 0);
264+
265+
MockHttpServletRequest request = new MockHttpServletRequest();
266+
request.addParameter("merged_page", "2");
267+
request.addParameter("merged_size", "10");
268+
269+
assertSupportedAndResult(parameter, PageRequest.of(2, 10), request);
270+
}
271+
260272
@Override
261273
protected PageableHandlerMethodArgumentResolver getResolver() {
262274
PageableHandlerMethodArgumentResolver resolver = new PageableHandlerMethodArgumentResolver();
@@ -298,5 +310,7 @@ void simpleDefaultWithContaineredExternalSort(@PageableDefault(size = PAGE_SIZE,
298310
void noQualifiers(Pageable first, Pageable second);
299311

300312
void emptyQualifier(@Qualifier Pageable pageable);
313+
314+
void mergedQualifier(@TestQualifier Pageable pageable);
301315
}
302316
}

src/test/java/org/springframework/data/web/SortHandlerMethodArgumentResolverUnitTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -251,6 +251,15 @@ void emptyQualifierIsUsedInParameterLookup() {
251251
assertSupportedAndResolvedTo(getRequestWithSort(reference, ""), parameter, reference);
252252
}
253253

254+
@Test // DATACMNS-1827
255+
void mergedQualifierIsUsedInParameterLookup() {
256+
257+
MethodParameter parameter = getParameterOfMethod("mergedQualifier");
258+
Sort reference = Sort.by("bar", "foo");
259+
260+
assertSupportedAndResolvedTo(getRequestWithSort(reference, "merged"), parameter, reference);
261+
}
262+
254263
private static Sort resolveSort(HttpServletRequest request, MethodParameter parameter) throws Exception {
255264

256265
SortHandlerMethodArgumentResolver resolver = new SortHandlerMethodArgumentResolver();
@@ -318,5 +327,7 @@ void simpleDefaultWithDirectionCaseInsensitive(
318327
void invalid(@SortDefaults(@SortDefault({ "foo", "bar" })) @SortDefault({ "bar", "foo" }) Sort sort);
319328

320329
void emptyQualifier(@Qualifier Sort sort);
330+
331+
void mergedQualifier(@TestQualifier Sort sort);
321332
}
322333
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
/*
2+
* Copyright 2020 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
package org.springframework.data.web;
17+
18+
import org.springframework.beans.factory.annotation.Qualifier;
19+
20+
import java.lang.annotation.Documented;
21+
import java.lang.annotation.ElementType;
22+
import java.lang.annotation.Retention;
23+
import java.lang.annotation.RetentionPolicy;
24+
import java.lang.annotation.Target;
25+
26+
/**
27+
* @author Vedran Pavic
28+
* @see PageableHandlerMethodArgumentResolverUnitTests
29+
* @see SortHandlerMethodArgumentResolverUnitTests
30+
*/
31+
@Documented
32+
@Retention(RetentionPolicy.RUNTIME)
33+
@Target(ElementType.PARAMETER)
34+
@Qualifier("merged")
35+
@interface TestQualifier {
36+
37+
}

0 commit comments

Comments
 (0)