«Чиним» OpenApi в springdoc-open-api

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

На смену 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 так сделать не получится. Но выход есть:

  1. Скрываем настоящий параметр с помощью аннотации @Parameter(hidden = true);

  2. Описываем правильный параметр самостоятельно.

Получается следующая конструкция:

    @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/


Интересные статьи

Интересные статьи

Выгрузка пользователей из 1C ЗУП в Битрикс24 или правдивая история о том как настроить интеграцию 1С-Битрикс24 с ЗУП без 1С-ника.В жизни так бывает, причём бывает чаще чем хотелось бы, хоть в целом и ...
Часто при разговорах с клиентами мы спрашиваем, как они ведут учет различных данных и используют ли они CRM-систему? Популярный ответ — мы работаем с Excel-файлами, а пот...
Привет, Хабр! Рады представить второй мажорный релиз PhpStorm в этом году! Под катом подробный разбор всех заметных изменений и новых возможностей. Осторожно — много картинок. ...
Одной из «киллер-фич» 12й версии Битрикса была объявлена возможность отдавать статические файлы из CDN, тем самым увеличивая скорость работы сайта. Попробуем оценить практический выигрыш от использова...
Согласно многочисленным исследованиям поведения пользователей на сайте, порядка 25% посетителей покидают ресурс, если страница грузится более 4 секунд.