Skip to content

Commit e21a785

Browse files
committed
DATACMNS-407 - Fixed sort parameter building in HateoasAwareSortHandlerMethodArgumentResolver.
We're now replacing the sort parameter for the URI to be created instead of simply appending them to the source URI to prevent previously applied sort parameters to be taken forward.
1 parent f148d19 commit e21a785

File tree

2 files changed

+26
-9
lines changed

2 files changed

+26
-9
lines changed

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

+9-6
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,14 @@
2626
/**
2727
* Extension of {@link SortHandlerMethodArgumentResolver} that also supports enhancing URIs using Spring HATEOAS
2828
* support.
29-
*
29+
*
3030
* @since 1.6
3131
* @author Oliver Gierke
3232
* @author Thomas Darimont
3333
* @author Nick Williams
3434
*/
35-
public class HateoasSortHandlerMethodArgumentResolver extends SortHandlerMethodArgumentResolver
36-
implements UriComponentsContributor {
35+
public class HateoasSortHandlerMethodArgumentResolver extends SortHandlerMethodArgumentResolver implements
36+
UriComponentsContributor {
3737

3838
/*
3939
* (non-Javadoc)
@@ -47,19 +47,22 @@ public void enhance(UriComponentsBuilder builder, MethodParameter parameter, Obj
4747
}
4848

4949
Sort sort = (Sort) value;
50+
String sortParameter = getSortParameter(parameter);
5051

5152
if (legacyMode) {
5253

5354
List<String> expressions = legacyFoldExpressions(sort);
5455
Assert.isTrue(expressions.size() == 2,
5556
String.format("Expected 2 sort expressions (fields, direction) but got %d!", expressions.size()));
56-
builder.queryParam(getSortParameter(parameter), expressions.get(0));
57-
builder.queryParam(getLegacyDirectionParameter(parameter), expressions.get(1));
57+
builder.replaceQueryParam(sortParameter, expressions.get(0));
58+
builder.replaceQueryParam(getLegacyDirectionParameter(parameter), expressions.get(1));
5859

5960
} else {
6061

62+
builder.replaceQueryParam(sortParameter);
63+
6164
for (String expression : foldIntoExpressions(sort)) {
62-
builder.queryParam(getSortParameter(parameter), expression);
65+
builder.queryParam(sortParameter, expression);
6366
}
6467
}
6568
}

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

+17-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
import static org.junit.Assert.*;
2020
import static org.springframework.data.domain.Sort.Direction.*;
2121

22+
import java.net.URI;
23+
2224
import org.junit.Test;
2325
import org.springframework.core.MethodParameter;
2426
import org.springframework.data.domain.Sort;
@@ -32,7 +34,7 @@
3234
public class HateoasSortHandlerMethodArgumentResolverUnitTests extends SortHandlerMethodArgumentResolverUnitTests {
3335

3436
@Test
35-
public void buildsUpRequestParameters() {
37+
public void buildsUpRequestParameters() throws Exception {
3638

3739
assertUriStringFor(SORT, "sort=firstname,lastname,desc");
3840
assertUriStringFor(new Sort(ASC, "foo").and(new Sort(DESC, "bar").and(new Sort(ASC, "foobar"))),
@@ -41,9 +43,21 @@ public void buildsUpRequestParameters() {
4143
"sort=foo,bar,asc&sort=foobar,desc");
4244
}
4345

44-
private void assertUriStringFor(Sort sort, String expected) {
46+
/**
47+
* @see DATACMNS-407
48+
*/
49+
@Test
50+
public void replacesExistingRequestParameters() throws Exception {
51+
assertUriStringFor(SORT, "/?sort=firstname,lastname,desc", "/?sort=foo,asc");
52+
}
53+
54+
private void assertUriStringFor(Sort sort, String expected) throws Exception {
55+
assertUriStringFor(sort, expected, "/");
56+
}
57+
58+
private void assertUriStringFor(Sort sort, String expected, String baseUri) throws Exception {
4559

46-
UriComponentsBuilder builder = UriComponentsBuilder.fromPath("/");
60+
UriComponentsBuilder builder = UriComponentsBuilder.fromUri(new URI(baseUri));
4761
MethodParameter parameter = getParameterOfMethod("supportedMethod");
4862

4963
new HateoasSortHandlerMethodArgumentResolver().enhance(builder, parameter, sort);

0 commit comments

Comments
 (0)