PagingAndSortingRepository - custom pageable response structure

前端 未结 2 550
刺人心
刺人心 2021-01-20 11:02

Is there a way to simplify the structure returned from this controller:

@GetMapping
public Iterable getAll(@PathParam("page") int page)          


        
相关标签:
2条回答
  • 2021-01-20 11:11

    Another way is to create a custom page class as you want and create from your data and 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;
        }
      }
    }
    

    And use like this

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

    Note: Here @Data of Lombok used for setter getter etc.

    0 讨论(0)
  • 2021-01-20 11:30
    • It looks like you have to create custom JsonSerializer with @JsonComponent annotation.

    • I will copy the code for reference but you can see it here. 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();
          }
        }
    
    0 讨论(0)
提交回复
热议问题