Java Knife4j案例如何整合项目

wen java案例 26

本文目录导读:

Java Knife4j案例如何整合项目

  1. 环境准备
  2. 配置文件
  3. 配置类
  4. 实体类示例
  5. Controller示例
  6. 启动类配置
  7. 访问Knife4j UI
  8. 高级配置选项
  9. 常见问题处理

我将为您详细介绍如何在Java项目中整合Knife4j(Swagger的增强工具),以下是完整的整合案例:

环境准备

Maven项目 - 添加依赖

pom.xml 中添加以下依赖:

<!-- Knife4j 核心依赖 -->
<dependency>
    <groupId>com.github.xiaoymin</groupId>
    <artifactId>knife4j-spring-boot-starter</artifactId>
    <version>3.0.3</version>
</dependency>
<!-- Spring Boot Web 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

Gradle项目 - 添加依赖

// Knife4j 核心依赖
implementation 'com.github.xiaoymin:knife4j-spring-boot-starter:3.0.3'
// Spring Boot Web 依赖
implementation 'org.springframework.boot:spring-boot-starter-web'

配置文件

application.yml 配置

server:
  port: 8080
spring:
  application:
    name: knife4j-demo
# Knife4j 配置
knife4j:
  enable: true
  production: false
  setting:
    language: zh-CN
    enable-dynamic-parameter: true  # 启用动态参数
    enable-swagger-models: true
    swagger-model-name: 实体类列表
# Swagger 配置
swagger:
  enable: true API文档
  description: 项目接口文档
  version: 1.0.0
  base-package: com.example.controller
  contact:
    name: 开发者
    url: https://example.com
    email: dev@example.com

application.properties 配置

server.port=8080
# Knife4j 配置
knife4j.enable=true
knife4j.production=false
knife4j.setting.language=zh-CN
knife4j.setting.enable-dynamic-parameter=true
knife4j.setting.enable-swagger-models=true
# Swagger 配置
swagger.enable=true
swagger.title=API文档
swagger.description=项目接口文档
swagger.version=1.0.0
swagger.base-package=com.example.controller

配置类

SwaggerConfiguration.java

package com.example.config;
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.*;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spi.service.contexts.SecurityContext;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import java.util.*;
@Configuration
@EnableSwagger2
@EnableKnife4j
public class SwaggerConfiguration {
    @Value("${swagger.base-package}")
    private String basePackage;
    @Value("${swagger.title}")
    private String title;
    @Value("${swagger.description}")
    private String description;
    @Value("${swagger.version}")
    private String version;
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                // 扫描的包路径
                .apis(RequestHandlerSelectors.basePackage(basePackage))
                .paths(PathSelectors.any())
                .build()
                .securityContexts(securityContexts())
                .securitySchemes(securitySchemes());
    }
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title(title)
                .description(description)
                .contact(new Contact("开发者", "https://example.com", "dev@example.com"))
                .version(version)
                .build();
    }
    // 配置JWT认证
    private List<SecurityScheme> securitySchemes() {
        return Arrays.asList(
                new ApiKey("Authorization", "Authorization", "header")
        );
    }
    private List<SecurityContext> securityContexts() {
        return Arrays.asList(
                SecurityContext.builder()
                        .securityReferences(securityReferences())
                        .forPaths(path -> path.contains("/api/"))
                        .build()
        );
    }
    private List<SecurityReference> securityReferences() {
        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
        authorizationScopes[0] = new AuthorizationScope("global", "accessEverything");
        return Arrays.asList(
                new SecurityReference("Authorization", authorizationScopes)
        );
    }
}

实体类示例

User.java

package com.example.entity;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "用户实体", description = "用户信息")
public class User {
    @ApiModelProperty(value = "用户ID", example = "1")
    private Long id;
    @ApiModelProperty(value = "用户名", example = "张三")
    private String username;
    @ApiModelProperty(value = "年龄", example = "25")
    private Integer age;
    @ApiModelProperty(value = "邮箱", example = "zhangsan@example.com")
    private String email;
    @ApiModelProperty(value = "手机号", example = "13800138000")
    private String phone;
}

Controller示例

UserController.java

package com.example.controller;
import com.example.entity.User;
import io.swagger.annotations.*;
import org.springframework.web.bind.annotation.*;
import java.util.*;
@RestController
@RequestMapping("/api/users")
@Api(tags = "用户管理接口")
public class UserController {
    @GetMapping
    @ApiOperation(value = "获取用户列表", notes = "分页查询用户信息")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "page", value = "页码", required = true, paramType = "query", dataType = "int", example = "1"),
        @ApiImplicitParam(name = "size", value = "每页数量", required = true, paramType = "query", dataType = "int", example = "10")
    })
    @ApiResponses({
        @ApiResponse(code = 200, message = "成功返回用户列表"),
        @ApiResponse(code = 400, message = "请求参数错误"),
        @ApiResponse(code = 500, message = "服务器内部错误")
    })
    public Map<String, Object> listUsers(@RequestParam(defaultValue = "1") int page,
                                         @RequestParam(defaultValue = "10") int size) {
        List<User> users = new ArrayList<>();
        // 模拟数据
        User user = new User();
        user.setId(1L);
        user.setUsername("张三");
        user.setAge(25);
        user.setEmail("zhangsan@example.com");
        user.setPhone("13800138000");
        users.add(user);
        Map<String, Object> result = new HashMap<>();
        result.put("data", users);
        result.put("total", 1);
        result.put("page", page);
        result.put("size", size);
        return result;
    }
    @GetMapping("/{id}")
    @ApiOperation(value = "根据ID获取用户", notes = "根据用户ID获取用户详细信息")
    @ApiImplicitParam(name = "id", value = "用户ID", required = true, paramType = "path", dataType = "long")
    public User getUserById(@PathVariable Long id) {
        User user = new User();
        user.setId(id);
        user.setUsername("张三");
        user.setAge(25);
        return user;
    }
    @PostMapping
    @ApiOperation(value = "创建用户", notes = "创建一个新用户")
    public User createUser(@RequestBody @ApiParam(value = "用户信息", required = true) User user) {
        user.setId(new Random().nextLong());
        return user;
    }
    @PutMapping("/{id}")
    @ApiOperation(value = "更新用户", notes = "更新用户信息")
    @ApiImplicitParam(name = "id", value = "用户ID", required = true, paramType = "path", dataType = "long")
    public User updateUser(@PathVariable Long id, @RequestBody @ApiParam(value = "用户信息", required = true) User user) {
        user.setId(id);
        return user;
    }
    @DeleteMapping("/{id}")
    @ApiOperation(value = "删除用户", notes = "根据ID删除用户")
    @ApiImplicitParam(name = "id", value = "用户ID", required = true, paramType = "path", dataType = "long")
    public String deleteUser(@PathVariable Long id) {
        return "用户 " + id + " 已删除";
    }
}

启动类配置

Application.java

package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@SpringBootApplication
@EnableSwagger2
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

访问Knife4j UI

启动项目后,访问以下地址:

http://localhost:8080/doc.html

高级配置选项

添加请求头参数

@Bean
public Docket createRestApi() {
    return new Docket(DocumentationType.SWAGGER_2)
            // ... 其他配置
            .globalRequestParameters(
                Arrays.asList(
                    new RequestParameterBuilder()
                        .name("token")
                        .description("用户令牌")
                        .in(ParameterType.HEADER)
                        .required(true)
                        .build()
                )
            );
}

分组配置

@Bean
public Docket adminApi() {
    return new Docket(DocumentationType.SWAGGER_2)
            .groupName("管理端API")
            .apiInfo(apiInfo())
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.example.controller.admin"))
            .paths(PathSelectors.ant("/admin/**"))
            .build();
}
@Bean
public Docket userApi() {
    return new Docket(DocumentationType.SWAGGER_2)
            .groupName("用户端API")
            .apiInfo(apiInfo())
            .select()
            .apis(RequestHandlerSelectors.basePackage("com.example.controller.user"))
            .paths(PathSelectors.ant("/api/**"))
            .build();
}

常见问题处理

解决静态资源冲突

spring:
  mvc:
    static-path-pattern: /static/**
  resources:
    static-locations: classpath:/static/

配置白名单

knife4j:
  basic:
    enable: true
    username: admin
    password: admin123

这样就完成了Knife4j在Java项目中的完整整合,访问 http://localhost:8080/doc.html 即可看到美观的API文档界面。

抱歉,评论功能暂时关闭!