可分页的REST API

时间:2018-11-08 18:04:26

标签: spring rest spring-mvc pagination

我正在使用Pageable返回带有页面的json结果。我的控制器的一个例子

@GetMapping("/nome/{nome}")
public ResponseEntity<Page<Cidadao>> consultaPorNome(
        @PathVariable(value="nome",required=true) String nome,
        @RequestParam(value="pagina", defaultValue="0") Integer page,
        @RequestParam(value="quantidade", defaultValue="10") Integer linesPerPage,
        @RequestParam(value="ordem", defaultValue="nome") String orderBy, 
        @RequestParam(value="direcao", defaultValue="ASC") String direction){

    Page<Cidadao> lista = cidadaoService.findByNome(nome,page,linesPerPage,orderBy, direction);
    return ResponseEntity.ok(lista);


}

我得到json

{
"content": [
    {
        "id": 1,
        "name": "Lucas"
    },
    {
        "id": 2,
        "name": "Erick"
    },
],
"totalElements": 23,
"totalPages": 3,
"last": false,
"numberOfElements": 10,
"first": true,
"sort": [
    {
        "direction": "ASC",
        "property": "nome",
        "ignoreCase": false,
        "nullHandling": "NATIVE",
        "ascending": true,
        "descending": false
    }
],
"size": 10,
"number": 0

}

但是我想以这种方式返回

{
    "data":{
         "content" : [
            {
             "id": 1,
              "name": "Lucas"
            },
            {
             "id": 1,
              "name": "Lucas"
            }         
          ],
          "totalElements": 23,
          "totalPages": 3,
          "last": false,
          "numberOfElements": 10,
          "first": true,
          "sort": [
              {
                  "direction": "ASC",
                  "property": "nome",
                  "ignoreCase": false,
                  "nullHandling": "NATIVE",
                  "ascending": true,
                  "descending": false
              }
          ],
          "size": 10,
          "number": 0
    },
    errors:[]
}

是否可以实现类似这样的功能来更改或添加诸如错误之类的属性?或者,如果可能的话,从Page中更改name属性,例如对totalofs更改numberofTotalElementBySomething .... ??

1 个答案:

答案 0 :(得分:0)

在寻找时,我没有找到解决此问题的漂亮方法。所以,我这样做:

创建一个名为PageAdapter的类(或您喜欢的任何类)

public class PageAdapter<T extends Serializable> implements Serializable   {

    private long totalElements;
    private long totalPages;
    private long size;
    private List<T> content;

    public PageAdapter(Page<T> page){
        this.totalElements = page.getTotalElements();
        this.totalPages = page.getTotalPages();
        this.size = page.getSize();
        this.content = page.getContent();
    }
}    

并在构造函数中接收原始的Pageable。 您可以自定义您的属性,在我的案例中使用了这些属性。 之后,您可以在控制器/资源中返回PageAdapter

如果有更好的解决方案,我也想知道。

一个建议,spring可以接收Pageable的实例,因此,您不需要接收有关大小,页面,顺序等的每个参数。 只需这样做:

public ResponseEntity<Page<Cidadao>> consultaPorNome(
    @PathVariable(value="nome",required=true) String nome, Pageable pageable){

您将获得有关尺寸,页面,订单...的所有信息。

我不是英语母语人士,因此可能包含语法错误。