18 ноября 2024
Тэги: gradle, Kotlin, rest, Spring Boot, руководство.
Ранее я уже публиковал статью Подключение Swagger к Spring Boot для создания документации по REST API. К сожалению, с последними версиями Spring Boot описанный там подход уже не работает, т.к. на смену springfox-swagger пришёл springdoc. По функционалу springdoc предоставляет всё то же самое, но аннотации для разметки классов и методов нужно использовать другие. Поэтому в данной статье подробно рассмотрим пример документирования REST API с помощью springdoc и его отличия от springfox.
Springdoc – это библиотека для проекта на Spring Boot, которая автоматически будет генерировать документацию по вашему REST API на основании исходного кода и специальных аннотаций. Таким образом, ваша документация будет всегда актуальной и её не нужно как-то дополнительно актуализировать каждый раз при изменении исходников.
В качестве примера рассмотрим REST API на основе spring-boot-starter-web. Также нам потребуется размечать наши сущности различными правилами валидации, поэтому добавим spring-boot-starter-validation.
Если ваш проект построен на основе spring-boot-starter-web, то для работы со springdoc достаточно подключить зависимость springdoc-openapi-starter-webmvc-ui. Если же вы используете реактивный стек на базе spring-boot-starter-webflux, то подключайте springdoc-openapi-starter-webflux-ui. Поддержка Kotlin в каждом из этих компонентов уже имеется.
В итоге наш список зависимостей в build.gradle.kts будет содержать следующее:
Предположим, что наше приложение возвращает информацию о пользователях. Для начала создадим data-класс с уникальным номером пользователя и его фамилией, а также разметим этот класс правилами валидации:
Аннотация @Schema относится к самому springdoc и с помощью параметра description позволяет указывать описание как всей сущности в целом, так и каждого его поля.
Аннотации валидации @Min и @Max позволяют задавать минимальное и максимальное значения, которые допустимы для данного числового поля. Числовые идентификаторы в БД, как правило, не могут быть отрицательными, поэтому указываем, что они начинаются с 1.
Аннотация @NotBlank говорит о том, что фамилия не может быть пустой строкой, а аннотация @Size задаёт минимальную и максимальную длину фамилии.
Всю информацию об этих ограничениях, а также текстовые описания мы позднее увидим в веб-интерфейсе springdoc.
Создадим простенький rest-контроллер PersonController, в котором будет всего 1 метод, возвращающий информацию о пользователе по его уникальному номеру.
Здесь аннотация @Tag позволяет указать имя контроллера (в springdoc будет выделено жирным шрифтом) и его описание. @Operation позволяет сделать то же самое для методов этого контроллера, но описание надо указывать в параметре summary. Также можно указать назначение каждого параметра в методе с помощью @Parameter.
Теперь давайте запустим наше приложение локально и перейдём по адресу http://127.0.0.1:8080/swagger-ui/index.html. Это стандартный адрес, по которому доступен веб-интерфейс springdoc, но этот адрес можно переопределить с помощью параметра springdoc.swagger-ui.path в application.yml.
Открыв springdoc вы сможете увидеть всю ту информацию, которую мы уже определили: описание контроллера, метода, его параметров, а также возвращаемой модели. Кроме того, для модели мы видим также диапазоны возможных значений, которые могут в ней приходить. Из веб-интерфейса можно даже отправлять тестовые запросы напрямую.
Бывает необходимо исключить из документации некоторые служебные параметры. Например, информация о текущем пользователе может подставляться из данных авторизации автоматически, поэтому такой параметр не нужно передавать снаружи. В нашем примере давайте добавим в метод ещё один опциональный параметр под названием flag.
Его необязательность определяет параметр required аннотации @RequestParam. А чтобы исключить его отображение в springdoc, достаточно указать аннотацию @Parameter с флагом hidden.
Предположим, наше API предоставляет также информацию об администраторе системы. Но мы не хотим, чтобы из документации пользователи могли узнать о наличии такого метода.
Аннотация @Operation с флагом hidden полностью исключает информацию о данном методе из документации.
Давайте теперь рассмотрим задачу сокрытия целого контроллера из sprindoc. Пусть у нас есть контроллер, который возвращает информацию о количестве средств на счёте любого пользователя по его id. Это приватная информация и в документации она фигурировать не должна.
Аннотация @Hidden скрывает весь rest-контроллер.
Тут важно заметить, что в реальных системах недостаточно просто скрыть какой-то параметр, метод или контроллер. Важно ещё и проверять права доступа каждого пользователя, который выполняет тот или иной запрос. Но это выходит за рамки данной статьи.
По умолчанию вам настраивать ничего не нужно. Достаточно просто добавить зависимость и springdoc уже начнёт работать. Но если вам потребуется более тонко настроить springdoc, то в application.yml вы можете добавить любой необходимый параметр.
Параметр springdoc.show-actuator позволяет включать/выключать отображение служебных эндпоинтов spring-boot-starter-actuator, если у вас подключена такая зависимость.
Параметр springdoc.swagger-ui.enabled позволяет включать/выключать веб-интерфейс springdoc, а springdoc.swagger-ui.path – переопределять стандартный урл этого веб-интерфейса.
На самом деле параметров значительно больше. Все они описаны в официальной документации.
Если в вашем проекте уже есть старая версия springfox-swagger, то вам достаточно удалить из зависимостей проекта всё, что связано со springfox, добавить то, что связано со springdoc и заменить аннотации в вашем коде по следующей таблице соответствий:
старый вариант | новый вариант |
---|---|
@Api | @Tag |
@ApiIgnore | @Parameter(hidden = true) или @Operation(hidden = true) или @Hidden |
@ApiModel | @Schema |
@ApiModelProperty | @Schema |
@ApiParam | @Parameter |
Как мы убедились, никаких принципиальных отличий между springfox и springdoc нет. Даже визуальных изменений в веб-интерфейсе практически нет. Изменились только аннотации. При этом для новых версий Spring Boot стандартом является именно springdoc, поэтому не стоит затягивать с переходом на него.
Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.
12.09.2022 15:02 stasevich
Описание rest-контроллера
@Tag(
name = "Пользователи",
description = "Все методы для работы с пользователями системы",
)
лишняя запятая после description
27.09.2023 01:11 Иван
Это топчик!! Спасибо
17.05.2024 11:51 dsfasd
конфиг нужно делать?
18.05.2024 00:11 devmark
Не более того, что указано в статье в разделе "Настройки springdoc".
10.09.2024 06:39 Jack
Большое спасибо за разъяснения!
18.11.2024 23:55 devmark
Актуализировал статью про Springdoc, т.к. она пользуется стабильным спросом. Также обновил проект на github, переведя его на Spring Boot 3 и Java 21.