本文目录导读:

我将为您详细介绍如何在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文档界面。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播