正如在最后一个答案中所说,最好的做法是使用页面包装器。这意味着您必须构建一个页面,该页面将创建您想要公开的资源的表示。
它将帮助您将链接放在内容之间进行分页,并且还可以像可分页界面一样获得元数据(页面总数、大小、元素数量等)。
这是一个简短的例子。提供了一个完整的例子HERE
public class PagedResource<T> {
private List<T> content;
private final Map metadata;
public PagedResource(Page<T> page, String pageParam, String sizeParam, String sortParam, String sortField) {
super();
this.setContent(page.getContent());
this.metadata = new HashMap();
List<Link> links = new ArrayList<Link>();
if (page.hasPrevious()) {
String path = createBuilder().queryParam(pageParam, page.getNumber() - 1).queryParam(sizeParam, page.getSize()).queryParam(sortParam, sortField).build().toUriString();
Link previousPageLink = new Link(path, Link.REL_PREVIOUS);
links.add(previousPageLink);
}
if (page.hasNext()) {
String path = createBuilder().queryParam(pageParam, page.getNumber() + 1).queryParam(sizeParam, page.getSize()).queryParam(sortParam, sortField).build().toUriString();
Link nextPageLink = new Link(path, Link.REL_NEXT);
links.add(nextPageLink);
}
if (!page.isFirst()) {
Link firstPageLink = buildPageLink(pageParam, 0, sizeParam, page.getSize(), sortParam, sortField, Link.REL_FIRST);
links.add(firstPageLink);
}
if (!page.isLast()) {
int lastPage = page.getTotalPages() - 1;
Link lastPageLink = buildPageLink(pageParam, lastPage, sizeParam, page.getSize(), sortParam, sortField, Link.REL_LAST);
links.add(lastPageLink);
}
Link currentPagelink = buildPageLink(pageParam, page.getNumber(), sizeParam, page.getSize(), sortParam, sortField, Link.REL_SELF);
links.add(currentPagelink);
populateMetadata(page, links);
}
private void populateMetadata(Page<T> page, List<Link> links) {
int per_page = page.getSize();
int totalPages = page.getTotalPages();
int numberOfPageElements = page.getNumberOfElements();
metadata.put("numberOfPageElements", numberOfPageElements);
metadata.put("perPage", per_page);
metadata.put("totalPages", totalPages);
metadata.put("links", links);
}
private Link buildPageLink(String pageParam, int page, String sizeParam, int size, String sortParam, String sortAttribute, String rel) {
String path = createBuilder().queryParam(pageParam, page).queryParam(sizeParam, size).queryParam(sortParam, sortAttribute).toUriString();
Link link = new Link(path, rel);
return link;
}
private ServletUriComponentsBuilder createBuilder() {
return ServletUriComponentsBuilder.fromCurrentRequestUri();
}
public List<T> getContent() {
return content;
}
public void setContent(List<T> content) {
this.content = content;
}
public Map getMetadata() {
return metadata;
}
}
希望对你有帮助!