Реактивная пагинация REST API - PullRequest
0 голосов
/ 17 января 2020

Столкнулся с проблемой добавления пагинации в реактивный REST API. Хотя есть способ добавить поле Pageable/PageRequest к моему объекту запроса, но он не работает так, как вы можете определить размер страницы в качестве параметров запроса.

Только один рабочий подход - определить page и size в качестве отдельных полей объекта запроса запроса явным образом, а затем преобразовать его в Pageable объект, используя PageRequest.of().

Вопрос: у нас есть неявный способ добавления разбиения на страницы к реактивным конечным точкам REST API как это работает в Spring MVC с использованием Pageable объекта в качестве параметра запроса?

Контроллер:

...
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

@RestController
@RequestMapping("/foos")
@RequiredArgsConstructor
public class FooController {

    private final FooService fooService;

    @GetMapping
    @Validated
    public Mono<Page<Foo>> readCollection(FooCollectionQuery query) { // Also tried to define Pageable as separate parameter here, still not working
        return fooService.readCollection(query);
    }

}

Объект запроса запроса:

...
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;

@Value
@EqualsAndHashCode(callSuper = false)
public class FooCollectionQuery {

    @NotNull
    UUID id;

    ...

    // Pageable page; - not working
    // Page page; - not working
    // PageRequest page; - not working

}

Способ, которым я пытался для вызова конечной точки с нумерацией страниц:

http://.../foos?page=1&size=2

1 Ответ

0 голосов
/ 17 января 2020

Проблема решена, так как Spring WebFlux не поддерживает разбиение на страницы, я добавил собственный распознаватель - ReactivePageableHandlerMethodArgumentResolver.

Вот пример того, как я его настраиваю:

@Configuration
public class WebConfig extends WebFluxConfigurationSupport {

    @Override
    protected void configureArgumentResolvers(ArgumentResolverConfigurer configurer) {
        configurer.addCustomResolver(new ReactivePageableHandlerMethodArgumentResolver());
        super.configureArgumentResolvers(configurer);
    }

}

И тогда я возможность использовать объект подкачки в объекте запроса запроса:

@GetMapping
    @Validated
    public Mono<Page<Foo>> readCollection(FooCollectionQuery query, Pageable page) {
        return fooService.readCollection(query);
    }
...