Skip to content

Commit afc2ea8

Browse files
committed
Adapt SortHandlerMethodArgumentResolver after changes to sort parameter.
Since the introduction of 6e22ffd, the sort parameter has been rendered as composite parameter which will cause the comma used to delimit property from direction potentially be encoded by clients following the URI template RFC. Thus, we need to defensively decode the source parameter value before parsing. Related ticket: GH-2531.
1 parent ee64329 commit afc2ea8

File tree

2 files changed

+21
-2
lines changed

2 files changed

+21
-2
lines changed

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.springframework.data.web;
1717

18+
import java.nio.charset.StandardCharsets;
1819
import java.util.Arrays;
1920

2021
import org.springframework.core.MethodParameter;
@@ -23,8 +24,8 @@
2324
import org.springframework.util.StringUtils;
2425
import org.springframework.web.bind.support.WebDataBinderFactory;
2526
import org.springframework.web.context.request.NativeWebRequest;
26-
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
2727
import org.springframework.web.method.support.ModelAndViewContainer;
28+
import org.springframework.web.util.UriUtils;
2829

2930
/**
3031
* {@link HandlerMethodArgumentResolver} to automatically create {@link Sort} instances from request parameters or
@@ -61,6 +62,10 @@ public Sort resolveArgument(MethodParameter parameter, @Nullable ModelAndViewCon
6162
return getDefaultFromAnnotationOrFallback(parameter);
6263
}
6364

64-
return parseParameterIntoSort(Arrays.asList(directionParameter), getPropertyDelimiter());
65+
var decoded = Arrays.stream(directionParameter)
66+
.map(it -> UriUtils.decode(it, StandardCharsets.UTF_8))
67+
.toList();
68+
69+
return parseParameterIntoSort(decoded, getPropertyDelimiter());
6570
}
6671
}

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
import jakarta.servlet.http.HttpServletRequest;
2222

23+
import java.nio.charset.StandardCharsets;
2324
import java.util.stream.Stream;
2425

2526
import org.junit.jupiter.api.BeforeAll;
@@ -35,6 +36,7 @@
3536
import org.springframework.util.StringUtils;
3637
import org.springframework.web.context.request.NativeWebRequest;
3738
import org.springframework.web.context.request.ServletWebRequest;
39+
import org.springframework.web.util.UriUtils;
3840

3941
/**
4042
* Unit tests for {@link SortHandlerMethodArgumentResolver}.
@@ -259,6 +261,18 @@ void mergedQualifierIsUsedInParameterLookup() {
259261
assertSupportedAndResolvedTo(getRequestWithSort(reference, "merged"), parameter, reference);
260262
}
261263

264+
@Test
265+
void readsEncodedSort() {
266+
267+
var request = new MockHttpServletRequest();
268+
request.addParameter("sort", UriUtils.encode("foo,desc", StandardCharsets.UTF_8));
269+
270+
var parameter = getParameterOfMethod("supportedMethod");
271+
var encoded = UriUtils.encode("foo,desc", StandardCharsets.UTF_8);
272+
273+
assertSupportedAndResolvedTo(new ServletWebRequest(request), parameter, Sort.by("foo").descending());
274+
}
275+
262276
private static Sort resolveSort(HttpServletRequest request, MethodParameter parameter) throws Exception {
263277

264278
var resolver = new SortHandlerMethodArgumentResolver();

0 commit comments

Comments
 (0)