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

w8ntj3qf  于 2022-10-04  发布在  Spring
关注(0)|答案(4)|浏览(270)

我正在尝试来自Spring data的Page和Pagable接口。它以以下格式返回JSON

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

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

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

5ssjco0h

5ssjco0h1#

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

8yoxcaq7

8yoxcaq72#

尝试使用:

@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

kognpnkq

kognpnkq3#

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

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

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

希望它能帮上忙!

kh212irz

kh212irz4#

使用@JsonProperty重命名。示例如下:

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import java.util.Iterator;
import java.util.List;
import java.util.function.Function;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

public class PageWrapper<T> implements Page<T> {

    private final Page<T> delegate;

    public PageWrapper(@JsonProperty("content") final List<T> content,
                       @JsonProperty("number") final int number,
                       @JsonProperty("size") final int size,
                       @JsonProperty("total_elements") final long totalElements) {
        delegate = new PageImpl<>(content, PageRequest.of(number, size), totalElements);
    }

    public PageWrapper(final List<T> content,
                       final Pageable pageable,
                       final long total) {
        delegate = new PageImpl<>(content, pageable, total);
    }
    @JsonProperty("total_pages")
    @Override
    public int getTotalPages() {
        return delegate.getTotalPages();
    }

    @JsonProperty("total_elements")
    @Override
    public long getTotalElements() {
        return delegate.getTotalElements();
    }

    @JsonProperty("number")
    @Override
    public int getNumber() {
        return delegate.getNumber();
    }

    @JsonProperty("size")
    @Override
    public int getSize() {
        return delegate.getSize();
    }

    @JsonProperty("number_of_elements")
    @Override
    public int getNumberOfElements() {
        return delegate.getNumberOfElements();
    }

    @JsonProperty("content")
    @Override
    public List<T> getContent() {
        return delegate.getContent();
    }

    @JsonProperty("has_content")
    @Override
    public boolean hasContent() {
        return delegate.hasContent();
    }

    @JsonIgnore
    @Override
    public Sort getSort() {
        return delegate.getSort();
    }

    @JsonProperty("is_first")
    @Override
    public boolean isFirst() {
        return delegate.isFirst();
    }

    @JsonProperty("is_last")
    @Override
    public boolean isLast() {
        return delegate.isLast();
    }

    @JsonIgnore
    @Override
    public boolean hasNext() {
        return delegate.hasNext();
    }

    @JsonIgnore
    @Override
    public boolean hasPrevious() {
        return delegate.hasPrevious();
    }

    @JsonIgnore
    @Override
    public Pageable nextPageable() {
        return delegate.nextPageable();
    }

    @JsonIgnore
    @Override
    public Pageable previousPageable() {
        return delegate.previousPageable();
    }

    @Override
    public <U> Page<U> map(final Function<? super T, ? extends U> function) {
        return delegate.map(function);
    }

    @JsonIgnore
    @Override
    public Iterator<T> iterator() {
        return delegate.iterator();
    }
}

相关问题