diff --git a/src/main/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolver.java b/src/main/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolver.java index cebfe4a12..988b6aca4 100644 --- a/src/main/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolver.java +++ b/src/main/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolver.java @@ -26,14 +26,14 @@ import org.springframework.web.util.UriComponentsBuilder; /** * Extension of {@link SortHandlerMethodArgumentResolver} that also supports enhancing URIs using Spring HATEOAS * support. - * + * * @since 1.6 * @author Oliver Gierke * @author Thomas Darimont * @author Nick Williams */ -public class HateoasSortHandlerMethodArgumentResolver extends SortHandlerMethodArgumentResolver - implements UriComponentsContributor { +public class HateoasSortHandlerMethodArgumentResolver extends SortHandlerMethodArgumentResolver implements + UriComponentsContributor { /* * (non-Javadoc) @@ -47,19 +47,22 @@ public class HateoasSortHandlerMethodArgumentResolver extends SortHandlerMethodA } Sort sort = (Sort) value; + String sortParameter = getSortParameter(parameter); if (legacyMode) { List expressions = legacyFoldExpressions(sort); Assert.isTrue(expressions.size() == 2, String.format("Expected 2 sort expressions (fields, direction) but got %d!", expressions.size())); - builder.queryParam(getSortParameter(parameter), expressions.get(0)); - builder.queryParam(getLegacyDirectionParameter(parameter), expressions.get(1)); + builder.replaceQueryParam(sortParameter, expressions.get(0)); + builder.replaceQueryParam(getLegacyDirectionParameter(parameter), expressions.get(1)); } else { + builder.replaceQueryParam(sortParameter); + for (String expression : foldIntoExpressions(sort)) { - builder.queryParam(getSortParameter(parameter), expression); + builder.queryParam(sortParameter, expression); } } } diff --git a/src/test/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolverUnitTests.java b/src/test/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolverUnitTests.java index d0492e740..65b6d3975 100644 --- a/src/test/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolverUnitTests.java +++ b/src/test/java/org/springframework/data/web/HateoasSortHandlerMethodArgumentResolverUnitTests.java @@ -19,6 +19,8 @@ import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.*; import static org.springframework.data.domain.Sort.Direction.*; +import java.net.URI; + import org.junit.Test; import org.springframework.core.MethodParameter; import org.springframework.data.domain.Sort; @@ -32,7 +34,7 @@ import org.springframework.web.util.UriComponentsBuilder; public class HateoasSortHandlerMethodArgumentResolverUnitTests extends SortHandlerMethodArgumentResolverUnitTests { @Test - public void buildsUpRequestParameters() { + public void buildsUpRequestParameters() throws Exception { assertUriStringFor(SORT, "sort=firstname,lastname,desc"); assertUriStringFor(new Sort(ASC, "foo").and(new Sort(DESC, "bar").and(new Sort(ASC, "foobar"))), @@ -41,9 +43,21 @@ public class HateoasSortHandlerMethodArgumentResolverUnitTests extends SortHandl "sort=foo,bar,asc&sort=foobar,desc"); } - private void assertUriStringFor(Sort sort, String expected) { + /** + * @see DATACMNS-407 + */ + @Test + public void replacesExistingRequestParameters() throws Exception { + assertUriStringFor(SORT, "/?sort=firstname,lastname,desc", "/?sort=foo,asc"); + } - UriComponentsBuilder builder = UriComponentsBuilder.fromPath("/"); + private void assertUriStringFor(Sort sort, String expected) throws Exception { + assertUriStringFor(sort, expected, "/"); + } + + private void assertUriStringFor(Sort sort, String expected, String baseUri) throws Exception { + + UriComponentsBuilder builder = UriComponentsBuilder.fromUri(new URI(baseUri)); MethodParameter parameter = getParameterOfMethod("supportedMethod"); new HateoasSortHandlerMethodArgumentResolver().enhance(builder, parameter, sort);