From a8ff4ea1429f8a4c42df2030d7ab9ccc0d742b12 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 18 Apr 2017 13:17:09 +0200 Subject: [PATCH] DATACMNS-1042 - PagedResourcesAssembler now keeps coordinates of supplied Page for self link. We now use the Pageable information contained in the given Page to make sure the self link rendered by the assembler adds proper coordinates. If a base link is provided, that is used as is. --- .../data/web/PagedResourcesAssembler.java | 4 +++- .../data/web/PagedResourcesAssemblerUnitTests.java | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java b/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java index 4c8c118d9..b61e9ac0b 100644 --- a/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java +++ b/src/main/java/org/springframework/data/web/PagedResourcesAssembler.java @@ -219,7 +219,9 @@ public class PagedResourcesAssembler implements ResourceAssembler, Pa resources.add(createLink(base, page.previousPageable(), Link.REL_PREVIOUS)); } - resources.add(createLink(base, null, Link.REL_SELF)); + Pageable current = new PageRequest(page.getNumber(), page.getSize(), page.getSort()); + + resources.add(link == null ? createLink(base, current, Link.REL_SELF) : link.withSelfRel()); if (page.hasNext()) { resources.add(createLink(base, page.nextPageable(), Link.REL_NEXT)); diff --git a/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java b/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java index 8138dcb8c..d082cbd21 100644 --- a/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java +++ b/src/test/java/org/springframework/data/web/PagedResourcesAssemblerUnitTests.java @@ -25,6 +25,7 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import org.hamcrest.Matcher; import org.junit.Before; import org.junit.Test; import org.springframework.data.domain.AbstractPageRequest; @@ -52,6 +53,7 @@ public class PagedResourcesAssemblerUnitTests { static final Pageable PAGEABLE = new PageRequest(0, 20); static final Page EMPTY_PAGE = new PageImpl(Collections. emptyList(), PAGEABLE, 0); + static final Matcher NO_TEMPLATE_VARIABLES = allOf(not(containsString("{")), not(containsString("}"))); HateoasPageableHandlerMethodArgumentResolver resolver = new HateoasPageableHandlerMethodArgumentResolver(); PagedResourcesAssembler assembler = new PagedResourcesAssembler(resolver, null); @@ -133,7 +135,7 @@ public class PagedResourcesAssemblerUnitTests { PagedResources> resources = assembler.toResource(createPage(1)); Link selfLink = resources.getLink(Link.REL_SELF); - assertThat(selfLink.getHref(), endsWith("localhost")); + assertThat(selfLink.getHref(), NO_TEMPLATE_VARIABLES); } @Test // DATACMNS-418 @@ -171,7 +173,7 @@ public class PagedResourcesAssemblerUnitTests { PagedResources> resources = assembler.toResource(createPage(1)); - assertThat(resources.getLink(Link.REL_SELF).getHref(), endsWith("localhost")); + assertThat(resources.getLink(Link.REL_SELF).getHref(), NO_TEMPLATE_VARIABLES); assertThat(resources.getLink(Link.REL_NEXT).getHref(), endsWith("?page=2&size=1")); assertThat(resources.getLink(Link.REL_PREVIOUS).getHref(), endsWith("?page=0&size=1")); } @@ -247,6 +249,14 @@ public class PagedResourcesAssemblerUnitTests { assertThat(assembler.toResource(EMPTY_PAGE), is(instanceOf(CustomPagedResources.class))); } + @Test // DATACMNS-1042 + public void selfLinkContainsCoordinatesForCurrentPage() { + + PagedResources> resource = assembler.toResource(createPage(0)); + + assertThat(resource.getLink(Link.REL_SELF).getHref(), endsWith("?page=0&size=1")); + } + private static Page createPage(int index) { AbstractPageRequest request = new PageRequest(index, 1);