SpringBoot3.3集成knif4j-swagger文档方式和使用案例

devtools/2024/10/18 14:22:06/

springboot3 集成 knif4j :

访问地址:

swagger 接口文档默认地址:http://localhost:8080/swagger-ui.html#

Knife4j 接口文档默认地址:http://127.0.0.1:8080/doc.html

Maven:

    <dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId><version>4.4.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><version>3.3.0</version></dependency><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-gateway-spring-boot-starter</artifactId><version>${knife4j-openapi3.version}</version></dependency>

基础微服务配置:


knife4j:# 开启增强配置enable: truebasic:enable: true# Basic认证用户名username: babasic# Basic认证密码password: BaBasic123!@#plm## 开启生产环境屏蔽,一定要先开启knife4j增强才会生效## You do not have permission to access this pageproduction: false

网关配置:

knife4j:gateway:enabled: true# 排序规则(tag/operation排序自4.2.0版本新增)# 取值:alpha-默认排序规则,官方swagger-ui默认实现,order-Knife4j提供的增强排序规则,开发者可扩展x-order,根据数值来自定义排序tags-sorter: orderoperations-sorter: order# 指定服务发现的模式聚合微服务文档strategy: manualroutes:- name: App1服务# 子服务存在其他分组情况,聚合其他分组url: /app1/v3/api-docs# 服务名称(Optional)service-name: baian-cloud-test-app1# 路由前缀context-path: /app1# 排序order: 1- name: App2服务# 子服务存在其他分组情况,聚合其他分组url: /app2/v3/api-docs# 服务名称(Optional)service-name: baian-cloud-test-app2# 路由前缀context-path: /app2# 排序order: 2- name: App3服务# 子服务存在其他分组情况,聚合其他分组url: /app3/v3/api-docs# 服务名称(Optional)service-name: baian-cloud-test-app3# 路由前缀context-path: /app3# 排序order: 3

全局添加自定义头

package com.baian.common.core.config;import io.swagger.v3.oas.models.Operation;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.parameters.HeaderParameter;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import lombok.extern.slf4j.Slf4j;
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
import org.springdoc.core.customizers.GlobalOperationCustomizer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
import org.springframework.web.method.HandlerMethod;import java.util.List;/*** @program: baian-cloud* @description: 为每个接口添加鉴权* @author: <航迹者-694204477@qq.com>* @create: 2024-07-02 10:21**/
@Slf4j
@Configuration
public class Knife4jOperationCustomizer {@Value("${sa-token.token-name:Authorization}")private String securityHeaderName;@Beanpublic GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() {return openApi -> {// 全局添加鉴权参数if (openApi.getPaths() != null) {HeaderParameter parametersItem = new HeaderParameter();parametersItem.setName(securityHeaderName);parametersItem.setRequired(false);Schema<String> schema = new Schema<>();schema.setType("string");parametersItem.setSchema(schema);openApi.getPaths().forEach((s, pathItem) -> {pathItem.readOperations().forEach(operation -> {// 为所有接口添加请求头operation.addParametersItem(parametersItem);// 为所有接口添加鉴权
//                        operation.addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION));});});}};}
}// https://doc.xiaominfo.com/docs/blog/add-authorization-header

注解:Springfox改用Springdoc后,注解改变:

@Api → @Tag@ApiIgnore → @Parameter(hidden = true) or @Operation(hidden = true) or @Hidden@ApiImplicitParam → @Parameter@ApiImplicitParams → @Parameters@ApiModel → @Schema@ApiModelProperty(hidden = true) → @Schema(accessMode = READ_ONLY)@ApiModelProperty → @Schema@ApiOperation(value = "foo", notes = "bar") → @Operation(summary = "foo", description = "bar")@ApiParam → @Parameter@ApiResponse(code = 404, message = "foo") → @ApiResponse(responseCode = "404", description = "foo")

实用新增注解:

@ParameterObject 

案例

@Tag(name = "用户接口")
@RestController
@RequestMapping("sys/user")
public class SysUserController {@Resourceprivate ISysUserService sysUserService;@Operation(summary = "分页查询")@GetMapping("page")public AjaxResult queryPage(@ParameterObject SysUserPageDTO dto) {PageInfo page = sysUserService.queryPage(dto);return AjaxResult.success(page);}@Operation(summary = "详情")@GetMapping("{id}")public AjaxResult queryInfo(@PathVariable Long id) {SysUserDTO dto = sysUserService.queryById(id);return AjaxResult.success(dto);}@Operation(summary = "新增")@PostMappingpublic AjaxResult save(@RequestBody SysUserDTO dto) {Long id = sysUserService.saveInfo(dto);return AjaxResult.success(id);}
}
@Getter
@Setter
@TableName("user")
@Schema(name = "User", description = "$!{table.comment}")
public class User implements Serializable {private static final long serialVersionUID = 1L;@Schema(description = "主键")@TableId("id")private Long id;@Schema(description = "用户名")@TableField("name")private String name;@Schema(description = "手机号")@TableField("phone")private String phone;@Schema(description = "性别")@TableField("sex")private String sex;@Schema(description = "状态 0:禁用,1:正常")@TableField("status")private Integer status;
}

其他参考:

https://gitee.com/-/ide/project/xiaoym/swagger-bootstrap-ui-demo/edit/master/-/knife4j-spring-boot3-demo/src/main/java/com/github/xiaoymin/boot3/config/SwaggerConfig.java

https://blog.csdn.net/m0_74055560/article/details/134348304

福利配置: 自动转发。

package com.baian.common.core.config;import io.undertow.servlet.spec.HttpServletRequestImpl;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;import java.io.IOException;/*** @program: baian-cloud* @description: resource* @author: <航迹者-694204477@qq.com>* @create: 2024-07-02 08:51**/
@RestController
@Slf4j
public class BaiAnResourceCtl {@GetMapping("/")public void context(HttpServletRequest request, HttpServletResponse response) throws IOException {log.error("=====baian-cloud-common-web-core=======com.baian.common.core.config.BaiAnResourceCtl=================默认根path/====重定向到/doc.html==========");if (request instanceof HttpServletRequestImpl undertow) {String resolvedPath = undertow.getExchange().getResolvedPath();response.sendRedirect(resolvedPath + "/doc.html");return;}response.sendRedirect("/doc.html");}}

http://www.ppmy.cn/devtools/56877.html

相关文章

eNSP中WLAN的配置和使用

一、基础配置 1.拓扑图 2.VLAN和IP配置 a.R1 <Huawei>system-view [Huawei]sysname R1 GigabitEthernet 0/0/0 [R1-GigabitEthernet0/0/0]ip address 200.200.200.200 24 b.S1 <Huawei>system-view [Huawei]sysname S1 [S1]vlan 100 [S1-vlan100]vlan 1…

基于 Triton Inference Server 的算法服务

如何将算法部署在 Triton Inference Server 基于Python后端的基础模型 (基础示例) 编写配置 config.pbtxt 以目标检测为例 定义输入输出: 参数名, 参数类型, 参数维度 name: "object_detect" # 模型名称, 与当前目录文件名一致 backend: "python" # 推…

五、golang基础之slice和map

文章目录 一、slice&#xff08;一&#xff09;含义&#xff08;二&#xff09;定义切片&#xff08;三&#xff09;切片初始化&#xff08;四&#xff09;len() 和 cap() 函数&#xff08;五&#xff09;空(nil)切片&#xff08;六&#xff09;切片截取&#xff08;七&#xf…

左值右值, 左值引用右值引用,完美转发

一. 左值和右值 左值: 可以取地址的对象 右值: 不可以取地址的对象 double x1.0, y 2.0; 1; // 字面量, 不可取地址, 是右值 x y; // 表达式返回值, 不可取地址, 是右值 max(x, y); // 传值返回函数的返回值 (非引用返回)总结就是: 根据是否可以取地址来区分是左值还…

C++与C#创建位图,是否需要区分RGB和BGR模式

在处理位图时&#xff0c;确实需要区分RGB和BGR模式&#xff0c;因为不同的库和API对颜色通道的排序有不同的约定。具体到C与C#&#xff0c;这一点也是需要注意的。 C 创建位图 使用GDI或WIC (Windows Imaging Component): 当你在C中使用这些Windows API创建或操作位图时&…

怎么缩小pdf文件大小

在数字化时代&#xff0c;pdf文件已经成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;随着pdf文件内容的增多&#xff0c;其大小也会相应增加&#xff0c;这给文件的传输、存储和共享带来了诸多不便。因此&#xff0c;如何有效地压缩pdf文件大小&#xff0c;成为了…

(实战场景)关于MongoDB使用TTL索引进行自动删除表数据的教程

要在MongoDB中创建TTL索引&#xff0c;以自动删除基于CreateTime字段的指定时间之前的数据&#xff0c;并且要确保兼容低版本的MongoDB&#xff0c;你可以按照以下步骤进行操作。 创建TTL索引 假设你有一个集合名为yourCollection&#xff0c;你想自动删除六个月之前的数据。…

java基于ssm+vue 病人跟踪治疗信息管理系统

1病人功能模块 病人登录进入病人跟踪治疗信息管理系统可以查看首页、个人中心、病例采集管理、预约管理、医生管理、上传核酸检测报告管理、上传行动轨迹管理、病人治疗状况管理等内容。 病例采集管理&#xff0c;在病例采集管理页面可以查看账号、姓名、住院号、入院时间、病…