На смену springfox пришел springdoc. Он приносит нам в проект Swagger и поддерживает спецификацию OpenApi 3. Но есть еще некоторые шерховатости, а именно правильное отображение параметров запроса для сортировки и постраничного вывода.
Давайте посмотрим, можно ли их исправить и как это сделать.
Проблема
После добавления в проект артефакта springdoc-openapi-ui становится доступна страница http://localhost:8080/swagger-ui.html
Все красиво и аккуратно кроме параметров типа Pageable
и Sort
.
@GetMapping("/sort") public @ResponseBody void sort(Sort sort) { // } @GetMapping("/pageable") public @ResponseBody void pageable(Pageable pageable) { // }
Описание Pageable
только выглядит странно, но пользоваться им можно.
Объект:
{ "page": 0, "size": 1, "sort": [ "string" ] }
будет преобразован в набор параметров строки запроса:
curl -X 'GET' 'http://localhost:8080/pageable?page=0&size=1&sort=string' -H 'accept: /'
А вот описание для Sort
не соответствует действительности. Нам нужен параметр строки запроса sort, а не вот это:
К тому же в этих объектах параметрах нет описаний.
Устранение
Для Pageable
все просто. Достаточно перед параметром метода аннотацию @ParameterObject
@GetMapping("/pageable") public @ResponseBody void pageable(@ParameterObject Pageable pageable) { // }
Красивое…
Для Sort
так сделать не получится. Но выход есть:
-
Скрываем настоящий параметр с помощью аннотации
@Parameter(hidden = true)
; -
Описываем правильный параметр самостоятельно.
Получается следующая конструкция:
@Parameter(in = ParameterIn.QUERY, description = "Sorting criteria in the format: property(,asc|desc). " + "Default sort order is ascending. " + "Multiple sort criteria are supported.", name = "sort", required = false, array = @ArraySchema(schema = @Schema(type = "string"))) @GetMapping("/sort") public @ResponseBody void sort(@Parameter(hidden = true) Sort sort) { // }
Теперь все выглядит так, как и задумывалось. Swagger можно использовать, а спецификацию OpenApi отдавать FrontEnd-разработчикам.
Надеюсь, что в скором времени для Sort
тоже можно будет использовать аннотацию @ParameterObject
.
ссылка на оригинал статьи https://habr.com/ru/post/658539/
Добавить комментарий