是否可以更改Spring Data可分页响应的JSON名称?

时间:2016-04-10 21:14:41

标签: java json spring spring-data spring-data-jpa

我正在尝试Spring Data的Page和Pageable接口。它以下列格式返回JSON

{"content":
[... my objects ...],
"last":false,
"totalPages":7,
"totalElements":13,
"size":2,
"number":0,
"sort":null,
"first":true,
"numberOfElements":2}

我遇到的问题是如何更改这些JSON元素的名称?

我工作的公司对服务JSON命名约定有严格的指导,所以开箱即用这对我不起作用,但如果可以更改这些名称,那么我可以使用它。

1 个答案:

答案 0 :(得分:1)

如上所述,最好的办法是使用页面包装器。这意味着你必须构建一个页面来创建你想要公开的资源的表示。

它可以帮助您将链接放在内容之间进行分页,也可以帮助您获取元数据(页面总数,大小,元素数量等),就像可分页界面一样。

这是一个简短的例子。提供了一个完整的示例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;
  }
}

希望它有所帮助!