【问题标题】:Is it possible to change the JSON names for Spring Data pageable responses?是否可以更改 Spring Data 可分页响应的 JSON 名称?
【发布时间】:2016-07-31 20:16:32
【问题描述】:

我正在尝试来自 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 命名约定有严格的指导方针,所以开箱即用这对我不起作用,但如果可以更改这些名称,那么我可以使用它。

【问题讨论】:

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


    【解决方案1】:

    尝试使用:

         @Entity
    public class City {
       @id
       Long id;
       String name;
    
       @JsonProperty("label")
       public String getName() { return name; }
    
       public void setName(String name){ this.name = name; }
    
       @JsonProperty("value")
       public Long getId() { return id; }
    
       public void setName(Long id){ this.id = id; }
    }
    

    reference

    【讨论】:

      【解决方案2】:

      创建一个类,可能称为PageWrapper,它实现org.springframework.data.domain.Page 并有一个构造函数,它获取另一个Page 作为参数。 将所有方法调用委托给包装的 Page 实例。 之后,您可以使用 @JsonProperty 注释重命名序列化 JSON 中的字段。 用PageWrapper 的实例包装Page(实际上是PageImpl)实例,并将资源方法的返回类型更改为PageWrapper

      【讨论】:

        【解决方案3】:

        正如在最后一个答案中所说,最好的做法是使用页面包装器。这意味着您必须构建一个页面,该页面将创建您想要公开的资源的表示。

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

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

        希望对你有帮助!

        【讨论】:

          猜你喜欢
          • 2019-06-28
          • 1970-01-01
          • 2012-07-03
          • 2018-10-12
          • 2016-08-28
          • 2023-03-09
          • 2015-09-18
          • 1970-01-01
          • 2018-07-08
          相关资源
          最近更新 更多