Spring Data Pageable не поддерживается как RequestParam в клиенте Feign - PullRequest
1 голос
/ 07 мая 2019

Я пытался выставить Feign Client для моего API для отдыха.Он принимает Pageable в качестве входных данных и определяет PageDefaults.

Контроллер:

@GetMapping(value = "data", produces = MediaType.APPLICATION_JSON_VALUE)
@ApiOperation(value = "Get Data", nickname = "getData")
public Page<Data> getData(@PageableDefault(size = 10, page = 0) Pageable page,
            @RequestParam(value = "search", required = false) String search) {
    return service.getData(search, page);
}

А вот мой симулированный клиент:

@RequestMapping(method = RequestMethod.GET, value = "data")
public Page<Data> getData(@RequestParam(name = "pageable", required = false) Pageable page,
            @RequestParam(name = "search", defaultValue = "null", required = false) String search);

Теперь проблема не зависит от того, какой размер страницы и номер страницы я отправляю Feign Client, он всегда применяет PageDefaults (0,10).

Когда я вызываю службу остальных напрямую, она работает: http://localhost:8080/data?size=30&page=6

Я использую Spring Boot 2.1.4.RELEASE и Spring Cloud Greenwich.SR1.Недавно было сделано исправление для поддержки Pageable (https://github.com/spring-cloud/spring-cloud-openfeign/issues/26#issuecomment-483689346). Однако я не уверен, что описанный выше сценарий не охватывается или я что-то упускаю.

1 Ответ

1 голос
/ 10 мая 2019

Я думаю, что ваш код не работает, потому что вы используете аннотацию @RequestParam для параметра Pageable в своем методе Feign.

Моя реализация такого метода работает, как и ожидалось.

Клиент:

@FeignClient(name = "model-service", url = "http://localhost:8080/")
public interface ModelClient {
    @GetMapping("/models")
    Page<Model> getAll(@RequestParam(value = "text", required = false) String text, Pageable page);
}

Контроллер:

@GetMapping("/models")
Page<Model> getAll(@RequestParam(value = "text", required = false, defaultValue = "text") String text, Pageable pageable) {
    return modelRepo.getAllByTextStartingWith(text, pageable);
}

Обратите внимание, что в моем случае, не выставляя PageJacksonModule как бин, Spring выдал исключение:

InvalidDefinitionException: невозможно создать экземпляр org.springframework.data.domain.Page

Так что мне пришлось добавить его в проект:

@Bean
public Module pageJacksonModule() {
    return new PageJacksonModule();
}

Моя рабочая демонстрация: github.com / Cepr0 / sb-feign-client-with-pageable-demo

...