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 SimplePagefindAll(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 SimplePageextends 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”