Skip to content

Commit 4c1aed2

Browse files
committed
DATACMNS-1551 - SortHandlerMethodArgumentResolver now drops dot-only property segments.
If plain dots were submitted as elements in a Sort expression to be parsed by SortHandlerMethodArgumentResolver, those dots would be considered a property of the sort expression, which is of course wrong. We now drop property candidates solely consisting of dots and whitespace.
1 parent bf1e00e commit 4c1aed2

File tree

2 files changed

+30
-1
lines changed

2 files changed

+30
-1
lines changed

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

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package org.springframework.data.web;
1717

1818
import java.util.ArrayList;
19+
import java.util.Arrays;
1920
import java.util.Collections;
2021
import java.util.List;
2122
import java.util.Optional;
@@ -221,7 +222,9 @@ Sort parseParameterIntoSort(String[] source, String delimiter) {
221222
continue;
222223
}
223224

224-
String[] elements = part.split(delimiter);
225+
String[] elements = Arrays.stream(part.split(delimiter)) //
226+
.filter(SortHandlerMethodArgumentResolver::notOnlyDots) //
227+
.toArray(String[]::new);
225228

226229
Optional<Direction> direction = elements.length == 0 ? Optional.empty()
227230
: Direction.fromOptionalString(elements[elements.length - 1]);
@@ -236,6 +239,16 @@ Sort parseParameterIntoSort(String[] source, String delimiter) {
236239
return allOrders.isEmpty() ? Sort.unsorted() : Sort.by(allOrders);
237240
}
238241

242+
/**
243+
* Returns whether the given source {@link String} consists of dots only.
244+
*
245+
* @param source must not be {@literal null}.
246+
* @return
247+
*/
248+
private static boolean notOnlyDots(String source) {
249+
return StringUtils.hasText(source.replace(".", ""));
250+
}
251+
239252
private static Optional<Order> toOrder(String property, Optional<Direction> direction) {
240253

241254
if (!StringUtils.hasText(property)) {

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import static org.assertj.core.api.Assertions.*;
1919
import static org.springframework.data.domain.Sort.Direction.*;
2020

21+
import java.util.stream.Stream;
22+
2123
import javax.servlet.http.HttpServletRequest;
2224

2325
import org.junit.BeforeClass;
@@ -182,6 +184,20 @@ public void doesNotReturnNullWhenAnnotatedWithSortDefault() throws Exception {
182184
assertThat(resolveSort(request, getParameterOfMethod("containeredDefault"))).isEqualTo(Sort.by("foo", "bar"));
183185
}
184186

187+
@Test // DATACMNS-1551
188+
public void resolvesDotOnlyInputToDefault() {
189+
190+
Stream.of(".", ".,ASC").forEach(it -> {
191+
192+
MockHttpServletRequest request = new MockHttpServletRequest();
193+
request.addParameter("sort", it);
194+
195+
assertThatCode(() -> {
196+
assertThat(resolveSort(request, PARAMETER)).isEqualTo(Sort.unsorted());
197+
}).doesNotThrowAnyException();
198+
});
199+
}
200+
185201
private static Sort resolveSort(HttpServletRequest request, MethodParameter parameter) throws Exception {
186202

187203
SortHandlerMethodArgumentResolver resolver = new SortHandlerMethodArgumentResolver();

0 commit comments

Comments
 (0)