Автор статьи: Сергей Прощаев @sproshchaev
Руководитель направления Java‑разработки в FinTech
В мире микросервисной архитектуры качественная документация API — это не роскошь, а необходимость. Она ускоряет интеграцию, снижает количество ошибок и упрощает жизнь как разработчикам, так и потребителям вашего сервиса. Исторически документация часто отставала от кода, но с появлением стандарта OpenAPI (ex‑Swagger) и его глубокой интеграции с экосистемой Spring этот процесс можно полностью автоматизировать.
В этой статье мы подробно рассмотрим, как профессионально подойти к документированию API, используя связку OpenAPI и Spring Boot. Чтобы материал был максимально практическим, мы создадим простой PersonService и на его примере покажем, как из кода генерируется всегда актуальная и интерактивная документация.
Что такое OpenAPI и зачем он нужен?
OpenAPI — это открытая спецификация для описания RESTful API. По сути, это язык, который позволяет в структурированном формате (YAML или JSON) описать все аспекты вашего API: эндпоинты, методы HTTP, параметры запроса, форматы тел запросов и ответов, модели данных, статус‑коды и даже требования к безопасности.
Использование OpenAPI решает несколько ключевых проблем:
Единый источник истины: документация генерируется прямо из кода, что исключает ее расхождение с реальностью.
Интерактивное тестирование: позволяет разработчикам сразу же опробовать API через веб‑интерфейс, не прибегая к Postman или curl.
Автогенерация кода: на основе OpenAPI‑спецификации можно автоматически генерировать клиентские SDK на разных языках, заглушки для сервера и многое другое.
Что такое SpringDoc OpenAPI?
SpringDoc — мост между Spring Boot и OpenAPI. SpringDoc — это библиотека с открытым исходным кодом, которая автоматически генерирует спецификацию OpenAPI 3.x из Spring‑приложения. Она интегрируется с такими фреймворками, как Spring MVC (Web), Spring WebFlux и Spring Boot.
Ключевое преимущество SpringDoc в его простоте. Достаточно добавить одну зависимость в ваш проект, и библиотека начнет сканировать ваши контроллеры, модели данных и конфигурации безопасности, чтобы построить точную спецификацию. На основе этой спецификации SpringDoc также предоставляет интерактивный UI Swagger, доступный по адресу /swagger‑ui.html.
Сравнение «ручного» подхода и автоматической генерации
Далее мы рассмотрим эти два варианта и обсудим плюсы и минусы использования каждого.
Сложность поддержки и актуальности
Ручное документирование требует от разработчика вести отдельный файл (например, openapi.yaml). Каждое изменение в коде — новый эндпоинт, изменение модели данных — должно быть вручную отражено в этом файле. Это создает постоянный риск расхождения, особенно в больших командах и на активных проектах. Процесс легко нарушить, забыв обновить документацию.
Автоматическая генерация с SpringDoc переносит burden описания API непосредственно в код. Документация становится побочным продуктом разработки. Если код изменился — изменилась и документация. Это значительно снижает операционные издержки и гарантирует, что документация всегда соответствует реализованному API.
Функциональность и удобство для потребителя
Статичный документ (PDF, Markdown) предоставляет только информацию для чтения. Разработчикам, которые хотят протестировать API, приходится вручную создавать запросы в сторонних инструментах, что замедляет процесс интеграции.
Интерактивный UI Swagger — это «играющая» документация. Потребитель API не только видит описание, но и может «выполнить» любой запрос прямо в браузере, передав необходимые заголовки и тело. Это убирает барьер для тестирования и делает API по‑настоящему discoverable.
Практический пример: Документируем Person Service
Для лучшего понимания рассмотрим, как выглядит процесс на практике. Создадим простой REST‑сервис для управления людьми, используя Lombok для минимизации шаблонного кода.
1. Подключение зависимостей
Добавляем SpringDoc и Lombok в pom.xml:
<dependencies>
<!-- SpringDoc OpenAPI -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.3.0</version>
</dependency>
<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
После этого по умолчанию UI Swagger будет доступен по адресу http://localhost:8080/swagger‑ui.html.
2. Создание модели и контроллера с аннотациями OpenAPI и Lombok
Теперь создадим модель Person и контроллер, обогатив их аннотациями для более детального описания. Lombok позволит нам избавиться от шаблонных геттеров, сеттеров и конструкторов.
Модель данных с Lombok:
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Schema(description = "Модель данных человека")
public class Person {
@Schema(description = "Уникальный идентификатор человека",
example = "123")
private Long id;
@Schema(description = "Имя человека",
example = "Иван",
requiredMode = Schema.RequiredMode.REQUIRED)
private String firstName;
@Schema(description = "Фамилия человека",
example = "Иванов",
requiredMode = Schema.RequiredMode.REQUIRED)
private String lastName;
@Schema(description = "Возраст человека",
example = "30",
minimum = "0", maximum = "150")
private Integer age;
}
Аннотации Lombok делают код исключительно чистым:
@Dataгенерирует геттеры, сеттеры,toString,equalsиhashCode@NoArgsConstructorсоздает пустой конструктор@AllArgsConstructorсоздает конструктор со всеми полями
Теперь напишем простой REST‑контроллер:
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.Parameter;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
@RestController
@RequestMapping("/api/persons")
@Tag(name = "Person API",
description = "API для управления данными о людях")
@RequiredArgsConstructor
public class PersonController {
private final Map<Long, Person> personStore
= new ConcurrentHashMap<>();
private final AtomicLong idCounter = new AtomicLong();
@Operation(
summary = "Получить человека по ID",
description = "Возвращает объект человека, если он найден в системе."
)
@ApiResponse(responseCode = "200", description = "Человек найден")
@ApiResponse(responseCode = "404", description = "Человек не найден")
@GetMapping("/{id}")
public ResponseEntity<Person> getPerson(@Parameter(description = "ID человека") @PathVariable Long id) {
Person person = personStore.get(id);
return person != null ? ResponseEntity.ok(person) : ResponseEntity.notFound().build();
}
@Operation(summary = "Создать нового человека")
@ApiResponse(responseCode = "201", description = "Человек успешно создан")
@PostMapping
public ResponseEntity<Person> createPerson(@RequestBody Person person) {
person.setId(idCounter.incrementAndGet());
personStore.put(person.getId(), person);
return ResponseEntity.status(HttpStatus.CREATED).body(person);
}
}
3. Результат: Интерактивная документация
После запуска приложения и перехода по адресу http://localhost:8080/swagger‑ui.html мы увидим полностью сгенерированную документацию нашего API.

* На главной странице будет отображен тег «Person API» с нашим описанием.
* Раскрыв эндпоинт GET /api/persons/{id}, мы увидим его описание, параметр id и возможные коды ответов.

* Нажав кнопку «Try it out», можно ввести значение ID и выполнить реальный запрос к нашему сервису.
* В разделе «Schemas» будут отображены модели данных, в том числе наша Person с примерами значений и описаниями полей.

Все достаточно компактно и интуитивно понятно и при этом любые изменения к коде автоматически обновляют документацию.
Рекомендации по документированию
При внедрении OpenAPI в ваш проект важно следовать нескольким принципам:
Документируйте прямо в процессе разработки — добавляйте аннотации сразу при создании контроллера или модели. Это становится привычкой, как написание тестов.
Используйте описательные примеры — так например поле example в аннотациях является мощным инструментом, который показывает потребителю API, какие данные стоит ожидать.
Не пренебрегайте описанием ошибок — создавайте стандартные модели для ошибок. Примером этого может служить ApiErrorResponse в котором можно документировать состав ошибок, которые может возвращать каждый эндпоинт (4xx, 5xx).
Настройте конфигурацию — используйте бин OpenAPI в конфигурации Spring, чтобы добавить общую информацию об API. Это может быть название, версия и контакты.
Пример такого бин OpenAPI в конфигурации Spring:
@Configuration
public class OpenApiConfig {
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info()
.title("Person Service API")
.version("1.0")
.description("Документация для микросервиса")
.contact(new Contact()
.name("Команда разработки")
.email("dev@example.com")));
}
}
Полный код примера доступен в репозитории GitHub по ссылке
Заключение
Выбор между ручным ведением документации и автоматической генерацией с помощью OpenAPI и SpringDoc — это выбор между прошлым и будущим разработки API. Ручной подход может казаться простым на старте, но с ростом проекта он неизбежно приводит к устаревшей и ненадежной документации.
Связка SpringDoc OpenAPI, Spring Boot предоставляет элегантное, мощное и практически бесплатное решение для создания всегда актуальной, интерактивной и полезной документации.
SpringDoc автоматически превращает этот код в качественную документацию. Это инвестиция в качество вашего продукта и в производительность команд, которые с ним работают. Начиная новый проект, сразу закладывайте эту практику в его основу — и ваши потребители скажут вам «спасибо».
Если вам близка тема архитектуры и практики построения современных приложений, стоит глубже взглянуть на сам фреймворк. На курсе «Разработчик на Spring Framework» разбирают реальные кейсы продакшн-разработки и учат работать со Spring Boot, MVC, Security и Reactive Stack — так, как это делают в коммерческих командах. Чтобы узнать, подойдет ли вам программа курса, пройдите вступительный тест.
А чтобы узнать больше о формате обучения и познакомиться с преподавателями, приходите на бесплатные демо-уроки:
12 ноября: «OpenAPI + Spring». Записаться
24 ноября: «Неожиданное введение в Spring MVC». Записаться