Рубрики
Без рубрики

Разбивка на страницы в API Spring Boot REST

Spring Boot предоставляет множество функций для поддержки разбиения на страницы изначально. Однако класс PageImpl таковым не является… Помечено как rest, разбивка на страницы, springboot, java.

Spring Boot предоставляет множество функций для поддержки разбиения на страницы изначально. Однако класс PageImpl напрямую не может использоваться с RestTemplate , а также создает много накладных расходов при выводе через REST API. Поэтому в этой статье мы хотели бы представить класс Simple Page , который упрощает структуру JSON и может использоваться непосредственно в шаблоне RestTemplate или TestRestTemplate.

Добавление разбивки на страницы в приложение

Чтобы добавить разбивку на страницы в RestController, нам сначала понадобятся входные параметры. Используя класс Pageable, параметры “страница” , “размер” и “сортировка” могут быть переданы конечной точке. Они автоматически привязываются Spring Boot к объекту. Желаемые значения по умолчанию также могут быть добавлены с помощью дополнительных аннотаций.

@RestController
@RequestMapping(value = "/api/roles", produces = MediaType.APPLICATION_JSON_VALUE)
public class RoleController {

    // ...

    @GetMapping
    public ResponseEntity> getAllRoles(
            @SortDefault(sort = "priRole") @PageableDefault(size = 20) final Pageable pageable) {
        return ResponseEntity.ok(roleService.findAll(pageable));
    }

}

Пример RestController с конечной точкой, поддерживающей разбивку на страницы

Поведение по умолчанию также можно настроить с помощью дополнительных свойств приложения .

Поскольку наш репозиторий расширяется JpaRepository , мы можем передать наш объект с возможностью просмотра непосредственно в Метод findAll() . Хранилище вернет объект типа Страница содержащая запрошенную страницу и ее содержимое .

public interface RoleRepository extends JpaRepository {
}

Наш репозиторий по умолчанию предоставляет доступ по страницам

Однако, если бы мы возвращали Страницу (или PageImpl ) непосредственно через нашу конечную точку, у нас были бы недостатки, описанные в начале. Поэтому промежуточный сервис не только отображает объект или объект СВЕРХУ, но также возвращает простой класс страницы .

@Service
public class RoleService {

    // ...

    public SimplePage findAll(final Pageable pageable) {
        final Page page = roleRepository.findAll(pageable);
        return new SimplePage<>(page.getContent()
                .stream()
                .map(role -> mapToDTO(role, new RoleDTO()))
                .collect(Collectors.toList()),
                page.getTotalElements(), pageable);
    }

}

Пример промежуточного обслуживания

Класс простых страниц с полной поддержкой Джексона

С помощью нашего нового класса мы упрощаем структуру JSON. Он исключает ненужные свойства из PageImpl и перезаписывает свойство сортировки так, чтобы оно максимально точно соответствовало входному параметру.

Конструктор необходим для того, чтобы Джексон мог инициализировать класс из входной строки. Это добавляет поддержку сериализации и десериализации, так что мы также можем вызывать нашу конечную точку с помощью шаблона RestTemplate .

@JsonIgnoreProperties({
        "pageable",
        "number",
        "numberOfElements",
        "first",
        "last",
        "empty"
})
public class SimplePage extends PageImpl {

    @JsonCreator
    public SimplePage(@JsonProperty("content") final List content,
            @JsonProperty("totalElements") final long totalElements,
            @JsonProperty("totalPages") final int totalPages,
            @JsonProperty("page") final int page,
            @JsonProperty("size") final int size,
            @JsonProperty("sort") final List sort) {
        super(content, PageRequest.of(page, size, Sort.by(sort.stream()
                .map(el -> el.split(","))
                .map(ar -> new Sort.Order(Sort.Direction.fromString(ar[1]), ar[0]))
                .collect(Collectors.toList()))), totalElements);
    }

    public SimplePage(final List content, final long totalElements, final Pageable pageable) {
        super(content, pageable, totalElements);
    }

    public int getPage() {
        return getNumber();
    }

    @JsonProperty("sort")
    public List getSortList() {
        return getSort().stream()
                .map(order -> order.getProperty() + "," + order.getDirection().name())
                .collect(Collectors.toList());
    }

}

Класс простых страниц

Вывод JSON нашего REST API будет выглядеть следующим образом. Простая страница может быть легко настроена, например, если требуется больше полей.

{
  "content": [
    {
      "name": "ADMIN"
    }
  ],
  "totalElements": 1,
  "totalPages": 1,
  "page": 0,
  "size": 20,
  "sort": [
    "priRole,ASC"
  ]
}

JSON-ответ нашей новой конечной точки

Уведомление поможет вам создать первую версию вашего следующего приложения Spring Boot, включая схему базы данных и API REST . Разбивка на страницы для конечных точек REST доступна в Профессиональном плане , который также включает генерацию базовых тестовых примеров с использованием тестовых контейнеров.

» Узнайте больше

Оригинал: “https://dev.to/tleipzig/pagination-in-a-spring-boot-rest-api-4766”