Что такое OpenAPI / Swagger и зачем это нужно Java-разработчику?
OpenAPI (ранее известный как Swagger) — это спецификация для описания, создания, документирования и потребления RESTful API. Для Java-разработчика библиотеки OpenAPI / Swagger — это незаменимый инструмент, который автоматизирует процесс документирования API и генерации клиентского кода.
Основные причины использовать OpenAPI / Swagger в Java-проектах:
- Автоматическая генерация документации — библиотека анализирует ваш код (аннотации Spring Boot, JAX-RS) и создает интерактивную документацию в формате Swagger UI.
- Стандартизация — единый формат описания API, понятный как людям, так и машинам.
- Генерация клиентского кода — можно сгенерировать Java-клиент для любого API, описанного в OpenAPI.
- Тестирование — Swagger UI позволяет выполнять запросы к API прямо из браузера.
- Интеграция с CI/CD — можно проверять соответствие API спецификации на этапе сборки.
В этой статье мы рассмотрим две основные Java-библиотеки: springdoc-openapi (для Spring Boot) и Swagger Core (для JAX-RS и других фреймворков).
Установка библиотеки OpenAPI / Swagger для Java
Установка зависит от используемого фреймворка. Рассмотрим два основных варианта.
Вариант 1: Spring Boot (springdoc-openapi)
Добавьте зависимость в ваш pom.xml (Maven):
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.6.0</version>
</dependency>
Для Gradle (build.gradle):
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0'
Вариант 2: JAX-RS / Jakarta (Swagger Core)
Maven:
<dependency>
<groupId>io.swagger.core.v3</groupId>
<artifactId>swagger-jaxrs2-jakarta</artifactId>
<version>2.2.22</version>
</dependency>
Gradle:
implementation 'io.swagger.core.v3:swagger-jaxrs2-jakarta:2.2.22'
Быстрый старт: первый пример с Spring Boot
После добавления зависимости springdoc-openapi в Spring Boot проект, Swagger UI автоматически доступен по адресу http://localhost:8080/swagger-ui.html. Создадим простой контроллер:
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/users")
@Tag(name = "User Controller", description = "Управление пользователями")
public class UserController {
@GetMapping("/{id}")
@Operation(summary = "Получить пользователя по ID")
public String getUser(@PathVariable Long id) {
return "User with ID: " + id;
}
@PostMapping
@Operation(summary = "Создать нового пользователя")
public String createUser(@RequestBody String userName) {
return "Created user: " + userName;
}
}
После запуска приложения откройте http://localhost:8080/swagger-ui.html — вы увидите интерактивную документацию с возможностью выполнять запросы.
Основные методы и аннотации OpenAPI / Swagger для Java
Рассмотрим 10 ключевых аннотаций и методов из библиотеки io.swagger.v3.oas.annotations.
1. @Operation
Что делает: Описывает отдельный эндпоинт (метод API). Добавляет описание, summary, теги и идентификатор операции.
Параметры:
summary— краткое описаниеdescription— подробное описаниеoperationId— уникальный идентификаторtags— массив тегов для группировкиdeprecated— пометить как устаревший
Пример:
@GetMapping("/search")
@Operation(
summary = "Поиск пользователей",
description = "Ищет пользователей по имени и возрасту",
operationId = "searchUsers",
tags = {"User Search"}
)
public List<String> searchUsers(@RequestParam String name, @RequestParam int age) {
return Arrays.asList("User1", "User2");
}
2. @ApiResponse
Что делает: Описывает возможный HTTP-ответ от эндпоинта. Позволяет задать код ответа, описание и схему данных.
Параметры:
responseCode— HTTP код (например, "200", "404")description— описание ответаcontent— содержимое ответа (массив @Content)
Пример:
@GetMapping("/{id}")
@Operation(summary = "Получить пользователя")
@ApiResponse(responseCode = "200", description = "Пользователь найден")
@ApiResponse(responseCode = "404", description = "Пользователь не найден")
public User getUser(@PathVariable Long id) {
// логика
}
3. @Tag
Что делает: Группирует эндпоинты по логическим категориям. Можно применять на уровне класса или метода.
Параметры:
name— название тегаdescription— описание группыexternalDocs— внешняя документация
Пример:
@RestController
@RequestMapping("/api/orders")
@Tag(name = "Orders", description = "Управление заказами")
public class OrderController {
// методы
}
4. @Schema
Что делает: Описывает модель данных (DTO, entity). Позволяет задать описание полей, примеры значений, ограничения.
Параметры:
description— описание поляexample— пример значенияrequired— обязательное полеminimum/maximum— числовые ограниченияpattern— регулярное выражение
Пример:
public class UserDto {
@Schema(description = "Уникальный идентификатор", example = "1")
private Long id;
@Schema(description = "Имя пользователя", example = "Иван", required = true)
private String name;
@Schema(description = "Email", example = "ivan@example.com", pattern = "^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$")
private String email;
}
5. @Parameter
Что делает: Описывает параметры запроса (path, query, header, cookie). Позволяет задать описание, обязательность, пример.
Параметры:
name— имя параметраdescription— описаниеrequired— обязательныйin— где находится параметр (PATH, QUERY, HEADER, COOKIE)example— пример значения
Пример:
@GetMapping("/filter")
@Operation(summary = "Фильтр пользователей")
public List<User> filterUsers(
@Parameter(description = "Минимальный возраст", example = "18", required = true)
@RequestParam int minAge,
@Parameter(description = "Город", example = "Москва")
@RequestParam(required = false) String city
) {
// логика
}
6. @RequestBody
Что делает: Описывает тело запроса. Позволяет задать описание, обязательность, пример содержимого.
Параметры:
description— описание телаrequired— обязательно ли телоcontent— массив @Content с медиа-типами
Пример:
@PostMapping("/create")
@Operation(summary = "Создать пользователя")
public User createUser(
@RequestBody(description = "Данные нового пользователя", required = true)
@Valid @RequestBody UserDto userDto
) {
// логика
}
7. @Content
Что делает: Описывает медиа-тип и схему для тела запроса или ответа. Используется внутри @ApiResponse и @RequestBody.
Параметры:
mediaType— MIME-тип (например, "application/json")schema— ссылка на @Schemaexamples— массив примеров
Пример:
@ApiResponse(
responseCode = "200",
description = "Успешный ответ",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = UserDto.class)
)
)
8. @Hidden
Что делает: Скрывает метод, параметр или модель из документации Swagger. Полезно для внутренних эндпоинтов.
Параметры: нет
Пример:
@Hidden
@GetMapping("/internal/health")
public String healthCheck() {
return "OK";
}
9. @SecurityRequirement
Что делает: Указывает, какие механизмы безопасности требуются для доступа к эндпоинту (JWT, Basic Auth, OAuth2).
Параметры:
name— название схемы безопасностиscopes— массив scope (для OAuth2)
Пример:
@GetMapping("/admin")
@Operation(summary = "Админский эндпоинт")
@SecurityRequirement(name = "bearerAuth")
public String adminEndpoint() {
return "Admin data";
}
10. @OpenAPIDefinition
Что делает: Задает глобальные метаданные API: название, версию, описание, контактную информацию, лицензию.
Параметры:
info— объект @Info (title, version, description)servers— массив серверовsecurity— глобальные схемы безопасности
Пример:
@OpenAPIDefinition(
info = @Info(
title = "My API",
version = "1.0.0",
description = "Документация для моего REST API",
contact = @Contact(
name = "Поддержка",
email = "support@example.com"
),
license = @License(
name = "Apache 2.0",
url = "http://springdoc.org"
)
),
servers = @Server(
url = "https://api.example.com",
description = "Production server"
)
)
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Реальный практический пример: REST API для интернет-магазина
Рассмотрим полноценный пример создания документированного API для интернет-магазина с использованием Spring Boot и
Также в библиотеке
Стандартная библиотека Go (Golang): полный обзор
Chucker для Kotlin: полное руководство с примерами
Генерация PDF на C++: обзор библиотек и примеры кода
Создание CLI-инструментов на Node.js: обзор фреймворков Commander, Yargs и Inquirer