From e21a7850f65034cce585418ba6b97d3c3ae890a2 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Mon, 16 Dec 2013 12:59:50 +0100 Subject: [PATCH] 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. --- ...eoasSortHandlerMethodArgumentResolver.java | 15 ++++++++------ ...andlerMethodArgumentResolverUnitTests.java | 20 ++++++++++++++++--- 2 files changed, 26 insertions(+), 9 deletions(-) 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);