---
title: "Springdoc-openapiとは？Spring Boot 4・3での導入方法とバージョン対応表【v3.1.1】"
url: "https://www.issoh.co.jp/tech/details/3749/"
published: 2024-10-04
updated: 2026-10-19
categories: ["Spring"]
publisher: "株式会社一創"
---

# Springdoc-openapiとは？Spring Boot 4・3での導入方法とバージョン対応表【v3.1.1】

Springdoc-openapiは、Spring BootのコントローラーからOpenAPI定義（JSON・YAML）とSwagger UIの画面を自動生成するJavaライブラリです。依存関係を1つ足せば動きますが、**Spring Bootの世代とSpringdocの系列が合っていないと、起動に失敗するか、起動してもSwagger UIとAPI定義のURLが404になります**。この記事では2026年10月19日時点の最新版（Spring Boot 4向け3.1.1、Spring Boot 3向け2.9.1）を前提に、選び方・設定・つまずき方を、Spring Boot 4.1.1と3.5.16で実際に動かした結果とあわせて示します。

## まとめ：Springdoc-openapiの導入で押さえること

- **Spring Boot 4なら3.1.1、Spring Boot 3なら2.9.1**。artifactIdはどちらも`springdoc-openapi-starter-webmvc-ui`（WebFluxは`-webflux-ui`）。Javaは両系列とも17以上で動く。
- 旧名の`springdoc-openapi-ui`（1.8.0で更新終了）はSpring Boot 2向け。Spring Boot 4に入れると起動はしても`/swagger-ui.html`も`/v3/api-docs`も404になる。
- 画面は`/swagger-ui.html`（`/swagger-ui/index.html`へ302）、定義は`/v3/api-docs`。既定の出力はOpenAPI 3.1.0。
- 本番で止めるなら`springdoc.api-docs.enabled=false`。`springdoc.swagger-ui.enabled=false`だけでは画面が消えるだけで、JSON定義は200で返り続ける。
- 3.x系（3.0.3以降）にはREST APIをAIエージェント用のMCPツールとして公開する機能がある。3.1.1から明示的に有効化しない限り何も登録されず、有効化した`/mcp`には認証が無いので、Spring Securityで守る前提で使う。

## Springdoc-openapiの役割

### 実行中のアプリから生成される2つの成果物

Springdocは起動したアプリのリクエストマッピング、引数と戻り値の型、Bean Validationの制約、`io.swagger.v3.oas.annotations`のアノテーションを読み取り、OpenAPI形式の定義を組み立てます。成果物は、機械が読む定義（`/v3/api-docs`のJSONと`/v3/api-docs.yaml`のYAML）と、人がブラウザで操作するSwagger UIの2つです。パス・HTTPメソッド・引数と戻り値の型はコードから自動で反映されるため、エンドポイントを変えれば定義も追従します。アノテーションを1つも付けなくてもここまでは出力されます。一方、エラー応答の種類や説明文はアノテーションで書いた内容がそのまま出るので、後述のように書き方を誤ると実装と食い違います。

### OpenAPI・Swagger・SpringFoxとの関係

OpenAPIはAPI定義の書式（仕様）、SwaggerはそのUIやエディタなどツール群の名前で、Springdocは「OpenAPI定義を生成し、閲覧用にSwagger UIを同梱する」立場です。仕様の版ごとの違いは[OpenAPIとは？Swaggerとの違いと仕様書(YAML/JSON)の書き方](/tech/details/10408/)で整理しています。同じ役割のSpringFoxは、GitHubの最新リリースが2020年7月14日の3.0.0のままで、jakarta名前空間のSpring Boot 3以降に対応していません。いま新しく選ぶ理由は無く、移行手順は後半の章にまとめました。なお公式サイトが「not maintained by the Spring Framework Contributors」と明記しているとおり、SpringdocはSpring公式の製品ではなく、コミュニティ主導のプロジェクトです。

## Spring Bootの世代別バージョン対応表

Springdocのメジャー版はSpring Bootのメジャー版と歩調を合わせて上がります（[GitHubのREADME](https://github.com/springdoc/springdoc-openapi)の「Versioning」に明記）。版の選択はSpring Bootの世代で決まり、迷う余地はほぼありません。最新版は[Maven Centralのメタデータ](https://repo1.maven.org/maven2/org/springdoc/springdoc-openapi-starter-webmvc-ui/maven-metadata.xml)と[GitHubのリリース一覧](https://github.com/springdoc/springdoc-openapi/releases)で2026年10月19日に確認した値です。

| 系列  | 最新版（公開日）          | 対応Spring Boot | Java | artifactId                          |
| --- | ----------------- | ------------- | ---- | ----------------------------------- |
| 3.x | 3.1.1（2026-09-06） | 4.0・4.1       | 17以上 | springdoc-openapi-starter-webmvc-ui |
| 2.x | 2.9.1（2026-09-06） | 3.x           | 17以上 | springdoc-openapi-starter-webmvc-ui |
| 1.x | 1.8.0（更新終了）       | 2.x・1.5       | 8以上  | springdoc-openapi-ui                |

3.x系がJava 21必須という説明を見かけますが、誤りです。3.1.1のjarに含まれるクラスファイルのバージョンは61（Java 17）で、[公式サイト](https://springdoc.org/)も「Spring-boot v4 (Java 17 & Jakarta EE 9)」と書いています。Spring Boot 4自体もJava 17から動きます。

公式サイトのFAQにある互換表は、3.x系について「4.0.x→3.0.x」の1行しか載っていません。ただし[3.1.0のリリースノート](https://github.com/springdoc/springdoc-openapi/releases/tag/v3.1.0)がSpring Boot 4.1.0への追随を明記しており、3.1.1の親POMもspring-boot-starter-parent 4.1.0です。Spring Boot 4.1で使うなら3.1.x、と読んでかまいません。2.x系の2.9.1はSpring Boot 3.5.16に対してビルドされています。Spring Boot 3.5のOSSサポートは2026年6月30日に終わっているため、2.x系は延命用と考えるのが妥当です。Spring Boot側の期限は[Spring Bootバージョン一覧とサポート期限（EOL）](/tech/details/5172/)で確認できます。

Maven Centralで「springdoc」を検索すると、`org.springdoc:spring-boot-springdoc`の3.1.2が上位に出ることがあります。これはPOMの説明が「Project for Springdoc integration」の検証用artifactで、Maven Central上のファイルは2020年5月6日から更新されていません。本体の版ではありません。

### 系列を取り違えたときの症状（実測）

同じコントローラーを持つアプリで、Spring Bootとspringdocの組み合わせだけを変えて起動しました（JDK 25、Maven 3.9.11）。

| Spring Boot | springdoc                  | 結果                           |
| ----------- | -------------------------- | ---------------------------- |
| 4.1.1       | 3.1.1                      | 正常（api-docs 200・UI 302→200）  |
| 4.1.1       | 2.9.1                      | 起動失敗（ClassNotFoundException） |
| 4.1.1       | springdoc-openapi-ui 1.8.0 | 起動成功・UIと定義が404               |
| 3.5.16      | 3.1.1                      | 起動失敗（NoClassDefFoundError）   |
| 3.5.16      | 2.9.1                      | 正常                           |

Spring Boot 4に2.9.1を入れた場合の最下層の例外は次のとおりです。Spring Boot 4でWebMvcPropertiesが別パッケージへ移ったため、2.x系のSwaggerConfigがクラスを見つけられません。

```
Caused by: java.lang.TypeNotPresentException: Type org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties not present
Caused by: java.lang.ClassNotFoundException: org.springframework.boot.autoconfigure.web.servlet.WebMvcProperties
```

逆にSpring Boot 3.5に3.1.1を入れると、`org/springframework/boot/web/context/servlet/ApplicationServletEnvironment`のNoClassDefFoundErrorで止まります。いちばん気づきにくいのは1.8.0の組み合わせです。エラーもログも出ずに起動し、springdocの自動設定が読まれないまま、Swagger UIとAPI定義のURLが404を返します（業務APIは動きます）。Spring Bootを上げた後にSwagger UIだけが404になったら、まず依存関係に旧名の`springdoc-openapi-ui`が残っていないかを確かめてください。

## 依存関係の追加（Maven・Gradle）

Spring Boot 4（Spring MVC）の場合、Mavenは`pom.xml`に次の1つを足します。Spring Boot 3なら`version`を2.9.1にします。

```
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>3.1.1</version>
</dependency>
```

Gradleは次の1行です。

```
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:3.1.1'
```

Spring Initializrが生成するSpring Boot 4のプロジェクトでは、Web機能の依存名が`spring-boot-starter-web`から`spring-boot-starter-webmvc`に変わっています（Spring Boot 4での依存名の変更は[Spring Bootとは｜4.1系の依存名の変更と最小Web APIの作り方](/tech/details/17478/)を参照）。springdoc側の依存名は2.x系から変わっていません。用途に応じたstarterは次のとおりです。

| starter                                 | Webスタック    | 付いてくるもの            |
| --------------------------------------- | ---------- | ------------------ |
| springdoc-openapi-starter-webmvc-ui     | Spring MVC | 定義＋Swagger UI      |
| springdoc-openapi-starter-webmvc-api    | Spring MVC | 定義のみ               |
| springdoc-openapi-starter-webflux-ui    | WebFlux    | 定義＋Swagger UI      |
| springdoc-openapi-starter-webflux-api   | WebFlux    | 定義のみ               |
| springdoc-openapi-starter-webmvc-scalar | Spring MVC | 定義＋Scalar（/scalar） |
| springdoc-openapi-starter-webmvc-mcp    | Spring MVC | MCPツール化（3.x系のみ）    |

WebFluxで組んでいる場合は[Spring WebFluxとは？MVCとの違い](/tech/details/3208/)のとおりスタックが別なので、`-webmvc-`を`-webflux-`に置き換えます。定義ファイルだけを外部ツールに渡し、画面は不要という構成なら`-api`で足ります。

## Swagger UIとapi-docsのURL

依存関係を足して起動すると、設定なしで次のパスが有効になります。ポート8080なら`http://localhost:8080/v3/api-docs`のように開きます。

| パス                          | 実測の応答                            |
| --------------------------- | -------------------------------- |
| /swagger-ui.html            | 302で/swagger-ui/index.htmlへ      |
| /v3/api-docs                | 200（JSON）                        |
| /v3/api-docs.yaml           | 200（application/vnd.oai.openapi） |
| /v3/api-docs/swagger-config | 200（UIが読む設定）                     |

3.1.1では起動時に「SpringDoc /v3/api-docs endpoint is enabled by default. To disable it in production, set the property ‘springdoc.api-docs.enabled=false’」という警告が出ます。不具合ではなく、本番で公開したままにしないための注意喚起です。

出力されるOpenAPIの版は既定で3.1.0です（[CHANGELOG](https://github.com/springdoc/springdoc-openapi/blob/main/CHANGELOG.md)によると2025年1月3日の2.8.0で3.1が既定になりました）。古いコード生成ツールなどが3.1を読めない場合は、`springdoc.api-docs.version=openapi_3_0`を設定すると`"openapi":"3.0.1"`で出力されました。生成した定義からクライアントコードを作るなら、[OpenAPI Generatorの使い方とMaven設定](/tech/details/3353/)側の対応版も合わせて確認してください。

## アノテーションと設定クラスの記述例

次のコントローラー（`BookController.java`）と設定クラス（`OpenApiConfig.java`）で、タグ・要約・パラメーター説明・スキーマ例・Bearer認証の定義まで出力できます。2つは別ファイルで、import文は省略しています。`@Valid`や`@NotBlank`を使うので、`spring-boot-starter-validation`も依存に入れてください。Javaのrecordにもそのまま使えます。

```
@RestController
@RequestMapping("/api/books")
@Tag(name = "books", description = "書籍の参照と登録")
public class BookController {

    public record Book(
            @Schema(description = "書籍ID", example = "42") long id,
            @Schema(description = "タイトル", example = "Spring入門") String title) {}

    public record CreateBookRequest(
            @NotBlank @Size(max = 100)
            @Schema(description = "タイトル", example = "Spring入門") String title) {}

    @Operation(summary = "書籍を1件取得する")
    @ApiResponse(responseCode = "200", description = "取得できた")
    @ApiResponse(responseCode = "404", description = "該当なし", content = @Content)
    @GetMapping("/{id}")
    public ResponseEntity<Book> get(@Parameter(description = "書籍ID") @PathVariable long id) {
        return id == 42 ? ResponseEntity.ok(new Book(42, "Spring入門")) : ResponseEntity.notFound().build();
    }

    @Operation(summary = "書籍を登録する")
    @PostMapping
    public Book create(@Valid @RequestBody CreateBookRequest req) {
        return new Book(1, req.title());
    }
}

@Configuration
public class OpenApiConfig {
    @Bean
    OpenAPI apiInfo() {
        return new OpenAPI()
                .info(new Info().title("Book API").version("v1"))
                .components(new Components().addSecuritySchemes("bearerAuth",
                        new SecurityScheme().type(SecurityScheme.Type.HTTP).scheme("bearer").bearerFormat("JWT")))
                .addSecurityItem(new SecurityRequirement().addList("bearerAuth"));
    }
}
```

Bean Validationの制約もスキーマに反映されます。`CreateBookRequest`の`title`は`required`に入り、`@Size(max = 100)`は`"maxLength":100,"minLength":0`になりました。`@NotBlank`からは`minLength:1`が出ない点は、仕様として受け取る側に伝えておく必要があります。`@Tag`を付けないと、タグ名はクラス名から自動で付きます。なお`OpenApiConfig`のBearer認証は「定義にこう記載する」という宣言で、実際の認証処理はしません。後述のSpring Securityの例はHTTP Basicなので、同じアプリで使うなら定義側の認証方式も実装に合わせてください。

### エラー応答だけを書いたときの200応答の欠落

上のコードから`@ApiResponse(responseCode = "200", …)`の行を消し、404の`content = @Content`も外して`@ApiResponse(responseCode = "404", description = "該当なし")`だけにすると、生成された定義の`responses`は404の1件だけになりました。正常系の200が定義から消え、しかも404側に`Book`のスキーマが付きます。この例では、メソッドに書いた`@ApiResponse`が戻り値から推測される200応答に置き換わった形です。

```
// 404だけを書いた場合の responses
{"404": {"description": "該当なし", "content": {"*/*": {"schema": {"$ref": "#/components/schemas/Book"}}}}}

// 200と404を書き、404に content = @Content を付けた場合
{"200": {"description": "取得できた", "content": {"*/*": {"schema": {"$ref": "#/components/schemas/Book"}}}},
 "404": {"description": "該当なし"}}
```

エラー応答を書き足すときは、200も明示し、本文の無い応答には`content = @Content`を付けます。Swagger UIでは応答の一覧を開かないと気づきにくく、見落とすと定義から生成したクライアントの戻り値の型が実装と合わなくなるおそれがあります。

### MockMvcTesterによる応答コードの検証

定義の崩れはテストで止められます。Spring Boot 4のMockMvcTesterで`/v3/api-docs`を読み、200と404の応答コードが定義にあるかだけを確かめるテストです。404だけ（`content = @Content`なし）を書いた版では失敗し、200と404を書いた版では成功しました。

```
@SpringBootTest
@AutoConfigureMockMvc
class ApiDocsTest {
    @Autowired
    MockMvcTester mvc;

    @Test
    void getBookDocumentsSuccessResponse() {
        assertThat(mvc.get().uri("/v3/api-docs"))
                .hasStatusOk()
                .bodyJson()
                .extractingPath("$.paths['/api/books/{id}'].get.responses")
                .asMap()
                .containsKeys("200", "404");
    }
}
```

Spring Boot 4では`AutoConfigureMockMvc`のパッケージが`org.springframework.boot.webmvc.test.autoconfigure`に移り、テスト用の依存は`spring-boot-starter-webmvc-test`です。

## application.propertiesでよく使う設定

設定はすべて`springdoc.`で始まります。既定値は[公式のプロパティ一覧](https://springdoc.org/#properties)の記載です。

| プロパティ                         | 既定値              | 用途                  |
| ----------------------------- | ---------------- | ------------------- |
| springdoc.api-docs.path       | /v3/api-docs     | 定義のURLを変える          |
| springdoc.swagger-ui.path     | /swagger-ui.html | 画面の入口URLを変える        |
| springdoc.api-docs.enabled    | true             | 定義と画面をまとめて止める       |
| springdoc.swagger-ui.enabled  | true             | 画面だけを止める            |
| springdoc.api-docs.version    | openapi\_3\_1    | openapi\_3\_0で3.0形式 |
| springdoc.packages-to-scan    | \*               | 対象パッケージを絞る          |
| springdoc.paths-to-match      | /\*              | 対象パスを絞る             |
| springdoc.use-management-port | false            | Actuatorのポートへ移す     |

`springdoc.swagger-ui.path=/docs`と`springdoc.api-docs.path=/openapi`に変えると、`/docs`は`/swagger-ui/index.html`への302になり、元の`/swagger-ui.html`と`/v3/api-docs`は404になりました。画面の実体は`/swagger-ui/index.html`のまま残るので、URLを変えても隠したことにはなりません。

### 本番で無効化するときの2つのプロパティの違い

本番プロファイルで止めるとき、どちらのプロパティを使うかで結果が変わります。実測の応答は次のとおりです。

| 設定                       | /v3/api-docs | /swagger-ui.html | /swagger-ui/index.html |
| ------------------------ | ------------ | ---------------- | ---------------------- |
| api-docs.enabled=false   | 404          | 404              | 404                    |
| swagger-ui.enabled=false | 200          | 404              | 404                    |

画面だけを消すと、全エンドポイントとスキーマを列挙したJSONは公開されたままです。本番で止めるなら`application-prod.properties`に`springdoc.api-docs.enabled=false`を書きます。両方を書いても害はありません。

## Spring SecurityによるSwagger UIとAPI定義の保護

本番でも社内向けにだけ見せたい場合は、Spring Securityで画面の入口・画面の実体・JSON定義・YAML定義の4種類のパスをまとめて守ります。`/swagger-ui.html`だけを守っても、画面の実体と定義が別のパスにあるためです。

```
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
    http.authorizeHttpRequests(auth -> auth
                    .requestMatchers("/swagger-ui.html", "/swagger-ui/**",
                            "/v3/api-docs", "/v3/api-docs/**", "/v3/api-docs.yaml").hasRole("DOCS")
                    .anyRequest().authenticated())
            .httpBasic(Customizer.withDefaults());
    return http.build();
}
```

Spring Boot 4.1.1で試した結果、5つのURL（`/swagger-ui.html`、`/swagger-ui/index.html`、`/v3/api-docs`、`/v3/api-docs.yaml`、`/v3/api-docs/swagger-config`）は、未認証で401、DOCSロールの無いユーザーで403、DOCSロールのユーザーで302または200になりました。注意したいのは`/v3/api-docs.yaml`で、`/v3/api-docs/**`だけを指定した設定では一致せず、DOCSロールの無いログインユーザーにもYAML定義が200で返りました（JSONは403）。YAMLのパスは明示してください。開発中だけ全員に開けたいなら`hasRole`を`permitAll()`に替えます。フィルタの評価順は[SecurityFilterChainとは？フィルタ実行順序と設定例](/tech/details/7001/)で解説しています。

## 3.x系のMCP連携：AIエージェント向けの公開設定とアクセス制御

3.x系には、`@RestController`のエンドポイントをMCP（Model Context Protocol）のツールとしてAIエージェントに公開する機能があります（[公式ドキュメントのMCP Support](https://springdoc.org/#mcp-support)）。専用starterは3.0.3で追加され、Maven Centralに2.x系の版はありません。3.1.0でSpring AI 2.0.0に追随しています。`/mcp`の受け口そのものはSpring AIのMCPサーバーstarterが提供するため、2つの依存を足します。

```
<dependency>
    <groupId>org.springframework.ai</groupId>
    <artifactId>spring-ai-starter-mcp-server-webmvc</artifactId>
    <version>2.0.0</version>
</dependency>
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-mcp</artifactId>
    <version>3.1.1</version>
</dependency>
```

```
spring.ai.mcp.server.protocol=streamable
springdoc.ai.mcp.enabled=true
```

前述のBookControllerで試すと、起動ログに「Registered 2 MCP tool callbacks from OpenAPI specification」と出て、MCPの`tools/list`に`get`と`create`の2つが並びました。ツールの説明は`@Operation`のsummaryに戻り値の型を足した「書籍を登録する. Returns Book (id, title)」で、入力スキーマはOpenAPI定義から作られます。`get`を`{"id":42}`で呼ぶと実際にAPIが呼ばれ、`{"id":42,"title":"Spring入門"}`が返りました。

POSTの`create`は実行されず、`"requires_human_approval":true`を含む応答が返りました。GET・HEAD・OPTIONS以外を「変更系」と見なし、人の承認を挟むのが既定です（`springdoc.ai.mcp.guardrails.require-approval-for-mutating-tools=true`）。

この機能は、社内のAIエージェントに既存の業務APIを読ませたいときに向いています。インターネットに出ているAPIへ、認証なしで有効化してはいけません。公式ドキュメントは、`/mcp`・`/mcp-ui`・`/api/mcp-admin/**`が独自の認証・認可を一切持たないこと、承認の手順は確認のためのもので、呼び出し元が自分で承認できてしまうためアクセス制御にはならないことを明記しています。前章と同じSecurityFilterChainでこの3パスを守ってから有効化してください。

[3.1.1のリリースノート](https://github.com/springdoc/springdoc-openapi/releases/tag/v3.1.1)では、7件のセキュリティ勧告が修正され、うち5件がMCP周り（パスパラメーターのエンコード漏れ、管理画面の既定公開、監査ログへの認証情報の記録など）でした。あわせて、starterを足すだけで`/mcp`が公開されていた挙動が、`springdoc.ai.mcp.enabled=true`を書くまで何も登録しない方式に変わっています。3.1.0でMCPを試した環境は3.1.1へ上げてください。実測では、`springdoc.ai.mcp.enabled`を書かない状態でもSpring AIのstarterが`/mcp`を200で受け付け、ツール一覧が空で返りました。springdoc側の既定が無効でも、Spring AIのstarterを入れた時点で受け口は開いていると考えて守る必要があります。

2.9.1と3.1.1は同日に公開され、Swagger UIに同梱されたDOMPurifyのXSS対応（Swagger UI 5.32.14への更新）と、`Accept-Language`ごとに定義をキャッシュすることによるメモリ枯渇の修正（`springdoc.cache.max-entries`、既定100）を両系列とも含みます。MCPを使わない場合も、それより前のパッチ版からは上げておくのが安全です。

## Swagger UIが表示されないときの確認順

Swagger UIが出ないときは、症状から原因を次の表で切り分けます。上の2行は前述の実測で再現した組み合わせです。

| 症状                   | 原因                                      | 対処                   |
| -------------------- | --------------------------------------- | -------------------- |
| 起動はするがUIも定義も404      | 旧名springdoc-openapi-ui（1.x）             | starter-webmvc-uiへ置換 |
| 起動時にClassNotFound系   | 系列とSpring Bootの世代違い                     | 対応表の系列に合わせる          |
| api-docsは200、画面だけ404 | \-api starterか swagger-ui.enabled=false | \-ui starterへ・設定を確認  |
| 401・403かログイン画面       | Spring Securityが遮断                      | UIと定義の4種類のパスを許可      |
| 特定の操作だけ出ない           | packages-to-scan等で除外                    | 対象範囲を見直す             |

コンテキストパス（`server.servlet.context-path`）を設定しているアプリでは、URLの先頭にそのパスが付きます。`/swagger-ui.html`で404でも、`/app/swagger-ui.html`なら開く、というケースです。

## SpringFoxから移行する手順

SpringFoxとSwagger 2のアノテーションを依存から外し、`springdoc-openapi-starter-webmvc-ui`を足したうえで、アノテーションを置き換えます。対応は[公式の移行ガイド](https://springdoc.org/#migrating-from-springfox)のとおりです。

| SpringFox（Swagger 2）              | Springdoc（Swagger 3）                            |
| --------------------------------- | ----------------------------------------------- |
| @Api                              | @Tag                                            |
| @ApiOperation(value, notes)       | @Operation(summary, description)                |
| @ApiParam・@ApiImplicitParam       | @Parameter                                      |
| @ApiModel・@ApiModelProperty       | @Schema                                         |
| @ApiIgnore                        | @Hidden など                                      |
| @ApiResponse(code = 404, message) | @ApiResponse(responseCode = “404”, description) |

パッケージは`io.swagger.v3.oas.annotations`に変わります。`Docket`のBeanを複数定義していた場合だけ、`GroupedOpenApi`のBeanに置き換えます（1つだけなら削除してプロパティに移します）。`@ApiResponse`を書き換えるときは、前述の「200が消える」挙動に注意してください。SpringFoxでは補われていた正常系の応答が、Springdocでは書かない限り出ません。

Spring BootでのAPI開発や、既存APIの仕様書整備・外部連携の設計を外部に頼みたい場合は、弊社の[API開発・システム連携の支援](/service/system/api/)でも対応しています。

## よくある質問

### Springdoc-openapiは無料で使えますか？

Apache License 2.0のオープンソースで、商用利用も無料です。受託開発の成果物にも組み込めます。再配布するときは、ライセンス文の同梱、NOTICEファイルがあればその内容の表示、改変したファイルへの変更表示といったApache License 2.0第4項の条件を守ります。

### Spring Boot 4でspringdoc-openapi-starter-webmvc-uiは使えますか？

使えます。artifactIdは2.x系と同じ`springdoc-openapi-starter-webmvc-ui`で、版を3.x系（2026年10月時点で3.1.1）にします。2.x系のままだとWebMvcPropertiesのClassNotFoundExceptionで起動しません。

### springdoc-openapi-uiとspringdoc-openapi-starter-webmvc-uiの違いは？

前者はSpring Boot 2向けの1.x系（最終1.8.0）、後者はSpring Boot 3以降向けの2.x・3.x系です。Spring Boot 3・4で前者を使うと、エラーが出ないままSwagger UIとAPI定義のURLが404になります。

### OpenAPI 3.0形式で出力できますか？

できます。`springdoc.api-docs.version=openapi_3_0`を設定すると`"openapi":"3.0.1"`で出力されます。既定は3.1.0です。

### 最新バージョンはどこで確認できますか？

Maven Centralの`springdoc-openapi-starter-webmvc-ui`のページか、GitHubのReleasesで確認します。2.x系と3.x系は同じ日に並んで公開されることが多く、2026年9月6日には2.9.1と3.1.1が出ました。公式サイトのFAQにある互換表は更新が遅れることがあります。

## 関連記事

- [OpenAPIとは？Swaggerとの違いと仕様書(YAML/JSON)の書き方｜3.0・3.1・3.2の差分](/tech/details/10408/)
- [Spring Boot 4とは？最新バージョン4.1の変更点・新機能とSpring Boot 3との違い【2026年10月】](/tech/details/10124/)
- [Spring Bootバージョン一覧とサポート期限（EOL）【2026年10月】最新版は4.1、4.0の無償サポートは12月末終了](/tech/details/5172/)
- [OpenAPI Generatorとは？使い方・生成されるコード・Maven設定を実行例で解説](/tech/details/3353/)
- [SecurityFilterChainとは？Spring Securityのフィルタ実行順序と設定例【Spring Security 7.1対応】](/tech/details/7001/)

---

出典: [Springdoc-openapiとは？Spring Boot 4・3での導入方法とバージョン対応表【v3.1.1】](<https://www.issoh.co.jp/tech/details/3749/>)（株式会社一創）
