PagingAndSortingRepository - 自定义可分页响应结构

PagingAndSortingRepository - custom pageable response structure

有没有办法简化从这个控制器 returned 的结构:

@GetMapping
public Iterable<Task> getAll(@PathParam("page") int page) {
    Pageable pageable = PageRequest.of(page, 3);

    return taskRepository.findAll(pageable);
}

目前回复正文如下:

localhost:8080/api/task?page=2

{
    "content": [
        ...
    ],
    "pageable": {
        "sort": {
            "sorted": false,
            "unsorted": true,
            "empty": true
        },
        "offset": 6,
        "pageSize": 3,
        "pageNumber": 2,
        "paged": true,
        "unpaged": false
    },
    "totalElements": 19,
    "last": false,
    "totalPages": 7,
    "number": 2,
    "size": 3,
    "sort": {
        "sorted": false,
        "unsorted": true,
        "empty": true
    },
    "numberOfElements": 3,
    "first": false,
    "empty": false
}

有什么方法可以减少这些数据吗?如果我现在对排序不感兴趣,只想 return 这样的事情怎么办:

{
    "content": [
        ...
    ],
    "pageable": {
        "pageSize": 3,
        "pageNumber": 2,
        "totalElements": 19,
    },
}

所以当前的响应有太多我并不真正需要的属性。实现这一目标的好方法是什么?如果我非常想自定义它,是否应该完全不同地执行此操作?

  • 看来您必须使用 @JsonComponent 注释创建自定义 JsonSerializer

  • 我将复制代码以供参考,但您可以在此处查看。 PageImpl JSON serialization

    @JsonComponent
    public class PageImplJacksonSerializer extends JsonSerializer<PageImpl<?>> {

    @Override
    public void serialize(PageImpl page, 
                          JsonGenerator jsonGenerator, 
                          SerializerProvider serializerProvider) 
                          throws IOException {

        jsonGenerator.writeStartObject();
        jsonGenerator.writeObjectField("content", page.getContent());
        jsonGenerator.writeBooleanField("first", page.isFirst());
        jsonGenerator.writeBooleanField("last", page.isLast());
        jsonGenerator.writeNumberField("totalPages", page.getTotalPages());
        jsonGenerator.writeNumberField("totalElements", page.getTotalElements());
        jsonGenerator.writeNumberField("numberOfElements", 
                                       page.getNumberOfElements());

        jsonGenerator.writeNumberField("size", page.getSize());
        jsonGenerator.writeNumberField("number", page.getNumber());
        //sort omitted 

        jsonGenerator.writeEndObject();
      }
    }

另一种方法是根据需要创建自定义页面 class,并根据您的数据创建 return

@Data
public class CustomPage<T> {
  List<T> content;
  CustomPageable pageable;

  public CustomPage(Page<T> page) {
    this.content = page.getContent();
    this.pageable = new CustomPageable(page.getPageable().getPageNumber(),
        page.getPageable().getPageSize(), page.getTotalElements());
  }

  @Data
  class CustomPageable {
    int pageNumber;
    int pageSize;
    long totalElements;

    public CustomPageable(int pageNumber, int pageSize, long totalElements) {

      this.pageNumber = pageNumber;
      this.pageSize = pageSize;
      this.totalElements = totalElements;
    }
  }
}

然后像这样使用

@GetMapping
public CustomPage<Task> getAll(@PathParam("page") int page) {
    Pageable pageable = PageRequest.of(page, 3);
    return new CustomPage<Task>(taskRepository.findAll(pageable));
}

注: 这里@Lombok的数据用于setter getter等