Knife 4 Jの戦い

公開日: 2026-07-30 19:37 更新日: 2026-07-30 19:38 3702文字 19 min read ... ページビュー

この記事では、Spring Boot 3プロジェクトにKnife 4 jを統合するための完全なプロセスとコアポイントを紹介します。Knife 4 jはOpen API 3仕様に基づいたインターフェイスドキュメント拡張ツールで、springdoc-openapiを介してドキュメントを生成し、Swagger UIと組み合わせて、インターフェイス検索、ソート、オフラインエクスポート、アクセス制御などの機能を備えた、よりフレンドリーなプレゼンテーションとデバッグ機能を提供します。この記事では、環境設定、依存関係の導入、アノテーションの使用、セキュリティポリシー、よくある問題のトラブルシューティングについて詳しく説明し、開発環境と本番環境での設定の違いを強調し、@Hiddenはドキュメントの隠蔽にのみ使用され、パーミッション制御には使用されず、Spring Securityなどのメカニズムと組み合わせて実際のインターフェイスのセキュリティ保護を実現する必要があることを明確にします。

Knife 4 Jの戦い

Knife 4 Jコア知識

Knife 4 Jとは?

Knife 4 jは、Java Webプロジェクトのためのインターフェイスドキュメント拡張ソリューションです。アプリケーションによって生成されたOpen APIドキュメントを読み取ることができ、より使いやすいインターフェイスプレゼンテーション、オンラインデバッグ、検索、ソート、オフラインエクスポート、アクセス制御などの機能を提供します。

Spring Boot 3プロジェクトでは、関連するコンポーネントは次のような関係として理解できます。

  • Open API 3:RESTful APIの仕様を記述します。
  • springdoc-openapi:Spring WebインターフェイスをスキャンしてOpen API 3ドキュメントを生成します。
  • Swagger UI:Open APIドキュメントを表示およびデバッグするための共通のWebインターフェイス。
  • Knife 4 j:Open APIドキュメントに基づく拡張されたインターフェイスと拡張機能を提供します。

したがって、Knife 4 jは新しいインタフェース仕様ではなく、Open API 3と同等でもない。Spring Boot 3プロジェクトでは、Knife 4 jの基盤となるドキュメント生成機能は主にspringdoc-openapiによって提供される。

Spring Boot 2とSpring Boot 3の主な違い

比較Spring Boot 2 共通シナリオSpring Boot 3 推奨シナリオ
Javaバージョンは通常 JDK 8 以上を使用できます。Spring Bootバージョンに応じてJDK 17
Java EEパッケージ名主にjavax.*を使用してjakarta.*
インターフェイス·ドキュメント仕様はOpen API 2またはOpen API 3推奨 Open API 3
一般的な実装Spring foxまたはSpring doc-openapiSpring doc-openapi
Knife 4 j Starter仕様とフレームワークのバージョンに基づいて対応するStarterを選択 Jakartaバージョンを使用したOpen API 3 Starter
共通注釈古いプロジェクトはio.swagger.annotations.*使用io.swagger.v3.oas.annotations.*

:Spring Boot 3 自体が“Swagger 2アノテーションを廃止”したわけではなく、Spring Boot 3プロジェクトは通常、古いSpringfoxベースのスキームを使用しなくなった。springdoc-openapiに移行したら、古い注釈をOpenAPI 3 注釈に置き換える必要があります。

Knife 4 jのSwagger UIの一般的な拡張機能

の比較Swagger UIKnife 4 j
ページの表示標準のOpenAPIドキュメントインターフェイスを提供中国語プロジェクトに適したインターフェイスの強化
インタフェースのデバッグオンラインでリクエストを送信できますパラメータの入力、リクエストのデバッグ、結果の表示を強化
インタフェースの取得基本フィルタリングのサポートインターフェイス検索などの拡張機能を提供
ドキュメントの書き出し完全なオフラインエクスポートプロセスはデフォルトでは提供されませんMarkdown、HTML、Word、Open APIドキュメントのエクスポートをサポート
拡张Swagger UIの設定項目の使用Knife4jの拡張設定を追加
アクセスの保護通常、セキュリティフレームワークと組み合わせる必要があります。本番環境保護やBasic 認証などの補助構成を提供

適用可能なシーン

  • フロントとリアの分離プロジェクトでインターフェースドキュメントを自動生成して維持します。
  • 開発およびテスト段階では、インターフェイスをオンラインで呼び出します。
  • リクエストパラメータ、レスポンス構造、ステータスコード、フィールドの説明を表示します。
  • マルチモジュールまたはマイクロサービスプロジェクトにおける統合管理インターフェイスのドキュメント。
  • インターフェイスドキュメントをエクスポートして、納品またはアーカイブに使用します。

Spring Boot 3とKnife 4 j

環境要件は

この記事では、次の環境を使用します。

  • JDK 17 以降。
  • Spring Boot 3.x。
  • Mavenプロジェクト。
  • spring-boot-starter-web.
  • Knife4J 4.5.0。

実際のプロジェクトでは、Spring Bootの特定のバージョンに対して依存性互換性をチェックする必要があります。“より高いバージョン”だけでコンポーネント互換性を判断するのではなく。

Maven 依存性の導入

Spring Boot 3はKnife 4 j Starterのジャカルタ版を使用しています。

<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
    <version>4.5.0</version>
</dependency>

StarterはOpen API 3に必要なspringdoc-openapi 関連の依存関係を統合しています通常、Springfox、Swagger 2、または他のバージョンのspringdoc-openapiを個別に導入する必要はありません。

application.ymlの設定

単一モジュールプロジェクトに適した基本構成を以下に示します。

server:
  port: 8080

spring:
  application:
    name: knife4j-spring-boot3-demo

springdoc:
  swagger-ui:
    path: /swagger-ui.html
    tags-sorter: alpha
    operations-sorter: alpha
  api-docs:
    path: /v3/api-docs
  group-configs:
    - group: default
      paths-to-match: /**
      packages-to-scan: com.example.knife4jdemo.controller

knife4j:
  enable: true
  setting:
    language: zh_cn

設定の手順:

  • springdoc.api-docs.pathはOpen API JSONドキュメントアドレスの設定に使用されます。
  • springdoc.group-configsは、ドキュメントグループ化、インタフェースパス、およびコントローラスキャンパッケージの設定に使用されます。
  • packages-to-scanは、現在のプロジェクトの実際のコントローラパッケージ名に置き換える必要があります。
  • knife4j.enableはKnife 4 jの拡張機能を有効にするために使用されます。
  • knife4j.setting.languageはインタフェース言語を設定するために使用される。

構成インタフェース·ドキュメントの基本情報

OpenAPI Beanを宣言することで、ドキュメントのタイトル、バージョン、説明、連絡先情報を統一的に設定できます。

package com.example.knife4jdemo.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Knife4jOpenApiConfig {

    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI()
                .info(new Info()
                        .title("用户管理系统接口文档")
                        .version("1.0.0")
                        .description("基于 Spring Boot 3、OpenAPI 3 和 Knife4j 构建的接口文档")
                        .contact(new Contact()
                                .name("项目开发组")
                                .email("demo@example.com"))
                        .license(new License()
                                .name("Apache 2.0")));
    }
}

プロジェクトを起動し、ドキュメントにアクセスする

Spring Bootプロジェクトを起動した後、ブラウザで次の手順にアクセスします。

http://localhost:8080/doc.html

Open API JSONドキュメントのデフォルトのアクセスアドレスは/v3/api-docsです。グループ化が設定されている場合は、対応するグループ化された文書アドレスも生成されます。

doc.htmlにアクセスできない場合のトラブルシューティング手順

通常、Starterの導入後に静的リソースマッピングを手動で設定する必要はありません。404401、または403が表示された場合は、次の順序でトラブルシューティングしてください。

  1. Maven 依存関係がSpring Boot 3 対応のJakarta Starterを使用しているか確認します。

  2. 複数のspringdoc-openapiまたはSpringfoxバージョンが誤って導入されていないか確認します。

  3. packages-to-scanが実際のコントローラパッケージパスであるかどうかを確認します。

  4. プロジェクトが@EnableWebMvcを使用しているかどうか、Spring MVC 構成を完全に引き継いでいるかどうかを確認します。

  5. Spring SecurityがドキュメントページとOpen APIドキュメントインターフェイスをブロックしていないか確認します。

  6. アプリケーションがcontext-pathで構成されているかどうか、アクセスアドレスにコンテキストパスを追加する必要があるかどうかを確認します。

補足リソースマッピングは、プロジェクトが静的リソース規則をカスタマイズし、自動構成が有効でないことを確認した場合にのみ考慮されます。

package com.example.knife4jdemo.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebResourceConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/doc.html")
                .addResourceLocations("classpath:/META-INF/resources/");

        registry.addResourceHandler("/webjars/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/");
    }
}

この構成はトラブルシューティングシナリオであり、すべてのSpring Boot 3プロジェクトに必須ではありません。

Open API 3 共通のコメント

旧注釈と新注釈の対照

の機能レガシー Swagger 2 注釈OpenAPI 3 注釈
コントローラーのグループ化@Api@Tag
インタフェースの説明@ApiOperation@Operation
パラメータの説明#パラメータノサクセイ#@ApiParam@ApiImplicitParam
複数のパラメータの説明ApiImplicitParams`@パラメータ
モデルの説明@ApiModel@Schema
フィールドの説明@ApiModelProperty@Schema
インタフェースまたはクラスの非表示@ApiIgnore@Hiddenまたは@Operation hidden = true

@Schemaによるエンティティークラスの記述

package com.example.knife4jdemo.domain;

import io.swagger.v3.oas.annotations.media.Schema;

@Schema(description = "用户信息")
public class User {

    @Schema(
            description = "用户主键",
            requiredMode = Schema.RequiredMode.REQUIRED,
            example = "10001"
    )
    private Long id;

    @Schema(
            description = "用户名",
            requiredMode = Schema.RequiredMode.REQUIRED,
            example = "zhangsan"
    )
    private String username;

    @Schema(
            description = "手机号码",
            requiredMode = Schema.RequiredMode.REQUIRED,
            example = "13800138000"
    )
    private String phone;

    @Schema(description = "年龄", example = "26")
    private Integer age;

    @Schema(description = "用户状态:0 表示禁用,1 表示正常", example = "1")
    private Integer status;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getStatus() {
        return status;
    }

    public void setStatus(Integer status) {
        this.status = status;
    }
}

Lombokを使用するプロジェクトでは、@Dataを使用してGetterとSetterを簡素化できますが、プロジェクトにLombokが正しく導入され、注記処理が有効になっていることを確認する必要があります。

@Tagおよび@Operationを使用したコントローラの記述

package com.example.knife4jdemo.controller;

import com.example.knife4jdemo.domain.User;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/users")
@Tag(name = "用户管理", description = "提供用户查询接口")
public class UserController {

    @GetMapping("/{id}")
    @Operation(
            summary = "根据编号查询用户",
            description = "根据用户主键查询用户详细信息"
    )
    public User getUserById(
            @Parameter(
                    description = "用户主键",
                    required = true,
                    example = "10001"
            )
            @PathVariable("id") Long id
    ) {
        User user = new User();
        user.setId(id);
        user.setUsername("zhangsan");
        user.setPhone("13800138000");
        user.setAge(26);
        user.setStatus(1);
        return user;
    }

    @GetMapping
    @Operation(
            summary = "查询用户列表",
            description = "查询当前系统中的用户数据"
    )
    public List<User> listUsers() {
        return List.of(getUserById(10001L));
    }
}

プロジェクト再開後の訪問:

http://localhost:8080/doc.html

ページには、ユーザー管理グループ、インターフェイスの概要、パラメータの説明、および応答モデルを表示する必要があります。

Knife 4 jの機能

グローバルJWT 認証の構成

JWTを使用するプロジェクトでは、Open APIドキュメントでHTTP Bearer 認証スキームを宣言できます。次の構成は、以前のOpenAPI Beanのアップグレード版であり、実際のプロジェクトには1つのOpenAPI Beanのみが残ります。

package com.example.knife4jdemo.config;

import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Knife4jOpenApiConfig {

    private static final String SECURITY_SCHEME_NAME = "BearerAuth";

    @Bean
    public OpenAPI customOpenAPI() {
        SecurityScheme securityScheme = new SecurityScheme()
                .type(SecurityScheme.Type.HTTP)
                .scheme("bearer")
                .bearerFormat("JWT")
                .description("输入登录后获得的 JWT");

        return new OpenAPI()
                .info(new Info()
                        .title("用户管理系统接口文档")
                        .version("1.0.0")
                        .description("支持 JWT 调试的接口文档")
                        .contact(new Contact()
                                .name("项目开发组")
                                .email("demo@example.com"))
                        .license(new License()
                                .name("Apache 2.0")))
                .components(new Components()
                        .addSecuritySchemes(SECURITY_SCHEME_NAME, securityScheme))
                .addSecurityItem(new SecurityRequirement()
                        .addList(SECURITY_SCHEME_NAME));
    }
}

設定が完了すると、ドキュメントページに認証ポータルが表示されます。開発者がJWTを入力すると、デバッグリクエストはBearer 認証に従ってAuthorizationリクエストヘッダーを運びます。

OpenAPIオブジェクトにセキュリティスキームを追加すると、ドキュメントはデフォルトで認証を必要としますが、Spring Securityのサーバー側認証ロジックを置き換えるものではありません。

オフラインドキュメントのエクスポート

Knife 4 jのドキュメント管理機能は、以下のものをエクスポートできます。

  • Markdownドキュメント。
  • オフラインのHTMLドキュメント。
  • Wordドキュメント。
  • オリジナルのOpen API JSONドキュメント

Knife 4 jエクスポート機能はPDFを直接生成しません。PDFが必要な場合は、MarkdownまたはHTMLをエクスポートし、他のツールを使用してPDFに変換できます。

表示する必要のないインターフェイスを隠す

@Hiddenを使用すると、コントローラまたはインタフェースを非表示にできます。

package com.example.knife4jdemo.controller;

import io.swagger.v3.oas.annotations.Hidden;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Hidden
@RestController
@RequestMapping("/admin")
public class AdminController {

    @PostMapping("/password")
    public String updatePassword() {
        return "密码修改成功";
    }
}

1つのメソッドだけを非表示にすることもできます。

@Hidden
@PostMapping("/internal/reset")
public String resetData() {
    return "重置成功";
}

重要事項@Hiddenは、インターフェイスがOpen APIドキュメントに表示されるかどうかを制御するだけで、クライアントがインターフェイスにアクセスするのをブロックしません。機密インターフェイスは、Spring Security、パーミッションチェックサムゲートウェイポリシーで保護する必要があります。

本番環境のセキュリティ構成

開発環境の設定

開発環境はインターフェイスドキュメントを開くことができます。

knife4j:
  enable: true
  production: false

本番環境のシャットダウンに関する文書

本番環境では、Knife 4 jページ、Swagger UI、Open API JSONインターフェイスを同時に閉じることができます。

springdoc:
  api-docs:
    enabled: false
  swagger-ui:
    enabled: false

knife4j:
  enable: false
  production: true

そのうち:

  • knife4j.productionはKnife 4 jの本番環境保護ポリシーを有効にするために使用されます。
  • springdoc.api-docs.enabledはOpen API JSONインターフェイスを閉じるために使用される。
  • springdoc.swagger-ui.enabledはSwagger UIをオフにするために使用されます。

本番環境でインターフェイスドキュメントを完全に無効にするかどうかは、プロジェクトのネットワーク分離、権限モデル、運用要件に基づいて決定する必要があります。

Basic 認証を使用したドキュメントの保護

内部テスト環境でオープンドキュメントが必要な場合は、Basic 認証を有効にできます。

knife4j:
  enable: true
  production: false
  basic:
    enable: true
    username: doc_user
    password: ${KNIFE4J_PASSWORD}

実際のパスワードをコードストアに直接保存しないでください。例環境変数KNIFE4J_PASSWORDを使用したパスワード注入。

Basic 認証は、ドキュメントアクセス保護の一部としてのみ使用できます。本番システムには、HTTPS、ネットワークアクセス制御、Spring Security、Unified Authenticationなどの対策も組み込む必要があります。

よくある質問

ページは開くが、インターフェイスがない

主なチェック:

  • packages-to-scanが正しく構成されているかどうか。
  • コントローラは@RestControllerを使用しています。
  • 要求メソッドは@GetMapping@PostMappingなどのマッピング注記を用いているかどうか.
  • コントローラがSpring Bootのデフォルトのスキャン範囲内にあるかどうか。
  • paths-to-matchが誤って構成されているかどうか。

ドキュメントページが401または403に戻る

これは通常、リクエストがセキュリティフィルタによって傍受されることを示します。開発環境では、以下のリソースをオンデマンドでリリースする必要があります。

  • /doc.html
  • /webjars/**
  • /v3/api-docs/**
  • /swagger-ui/**
  • /swagger-ui.html

リリースするかどうかは、プロジェクトが実際に使用するSpring Securityのバージョンとパーミッションポリシーに基づいて行われます。

ドキュメントページは404に戻る

主なチェック:

  • スターターは正しい選択をします。
  • ダウンロードが成功したかどうかに依存します。
  • 依存関係の対立がある。
  • 適用コンテキストパスが設定されているかどうか。
  • 自動構成が@EnableWebMvcで上書きされているかどうか。
  • 静的リソースマッピングがカスタマイズされているかどうか。

注記がドキュメントに表示されません

コールアウトパッケージがio.swagger.v3.oas.annotationsからのものであるかどうかを確認します。古いio.swagger.annotationsとOpen API 3アノテーションを混ぜないでください。

インタフェースを変更してもドキュメントは変更されない

順番に試すことができます:

  1. コードを再コンパイルしてアプリケーションを再起動します。

  2. ブラウザのページを更新します。

  3. Knife 4 jページキャッシュをクリアする

  4. 現在表示されているものが正しくグループ化されているかどうかをチェックします。

  5. /v3/api-docsに直接アクセスして、バックエンドで生成されたOpen API JSONが更新されているか確認します。

概要まとめ

Spring Boot 3のKnife 4 j 統合のコアプロセスは以下のとおりです。

  1. JDK 17 以上を使用しています。

  2. Knife 4 j Open API 3 StarterのJakarta 版を導入。

  3. springdocを使用して、パッケージ、グループ化、Open APIドキュメントパスをスキャンします。

  4. OpenAPI Beanからドキュメントプロフィールと認証スキームを設定します。

  5. インタフェースは、@Tag@Operation@Parameter、および@Schemaを使用して記述される。

  6. 開発環境ではドキュメントをオープンにし、本番環境ではセキュリティ要件に従ってアクセスを閉じたり制限したりします。

  7. “隠されたインターフェイスドキュメント”と“実際のインターフェイスを保護する”を明確に区別し、@Hiddenを権限制御手段として使用することはできません。

気に入ったならばコメントを残してくださいね~

... ページビュー
© 2026 跨越星轨的客 @Hoshiumi
Powered by theme astro-koharu · Inspired by Shoka