Spring Boot 3 集成 Knife4j

基础环境

SpringBoot : 3.0.6
Java: jdk-17.0.5
Maven: 3.6.1

依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.0.6</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.giser</groupId><artifactId>gis-java-mp</artifactId><version>0.0.1-SNAPSHOT</version><name>gis-java-mp</name><description>Demo project for Spring Boot</description><properties><java.version>17</java.version></properties><dependencies><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3</version><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></exclusion></exclusions></dependency><!-- 多数据源配置 --><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.6.1</version><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></exclusion><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></exclusion></exclusions></dependency><!-- 代码自动生成 start --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId><version>2.1.3.RELEASE</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId><version>3.1.5</version></dependency><!-- 代码自动生成 end --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>3.0.0</version></dependency><!-- Spring Boot 3 集成 Knife4j start --><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId></dependency><!-- Spring Boot 3 集成 Knife4j end --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.10</version></dependency><!-- <dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId></dependency>--></dependencies><repositories><repository><id>nexus-maven</id><name>nexus-maven</name><url>https://oss.sonatype.org/content/repositories/snapshots/</url></repository></repositories><!-- Spring Boot 3 集成 Knife4j start --><dependencyManagement><dependencies><dependency><groupId>com.github.xiaoymin</groupId><artifactId>knife4j-dependencies</artifactId><version>4.3.0-SNAPSHOT</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><!-- Spring Boot 3 集成 Knife4j end --><build><finalName>gis-mp</finalName><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><mainClass>com.giser.mp.Knife4jSpringBoot3DemoApplication</mainClass></configuration></plugin></plugins></build></project>

基础配置

server:port: 9999servlet:context-path: /encoding:charset: UTF-8spring:datasource:params: useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=GMT%2B8dynamic:primary: masterstrict: falsedatasource:master:url: jdbc:mysql://ip:port/db_name?${spring.datasource.params}username: db_userpassword: db_pwdslave:url: jdbc:mysql://ip:port/db_name?${spring.datasource.params}username: db_userpassword: db_pwdhikari:max-lifetime: 20000connection-timeout: 10000idle-timeout: 3000000min-idle: 4max-pool-size: 12
#servlet:multipart:max-file-size: 100MBmax-request-size: 100MBapplication:name: gis-java-mp
springdoc:swagger-ui:path: /swagger-ui.htmltags-sorter: alpha#operations-sorter: orderapi-docs:path: /v3/api-docsgroup-configs:- group: 'default'paths-to-match: '/**'# 生成接口文档的所需扫描的包路径packages-to-scan: com.giser.boot.knife4jdefault-flat-param-object: trueknife4j:enable: truesetting:language: zh_cnbasic:enable: falseusername: abcpassword: 123

使用

配置Swagger

package com.giser.mp.config;import cn.hutool.core.util.RandomUtil;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.info.License;
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.HashMap;
import java.util.Map;@Configuration
public class SwaggerConfig {/*** 根据@Tag 上的排序,写入x-order** @return the global open api customizer*/@Beanpublic GlobalOpenApiCustomizer orderGlobalOpenApiCustomizer() {return openApi -> {if (openApi.getTags()!=null){openApi.getTags().forEach(tag -> {Map<String,Object> map=new HashMap<>();map.put("x-order", RandomUtil.randomInt(0,100));tag.setExtensions(map);});}if(openApi.getPaths()!=null){openApi.addExtension("x-test123","333");openApi.getPaths().addExtension("x-abb",RandomUtil.randomInt(1,100));}};}@Beanpublic OpenAPI customOpenAPI() {return new OpenAPI().info(new Info().title("XXX用户系统API").version("1.0").description( "Knife4j集成springdoc-openapi示例").termsOfService("http://doc.xiaominfo.com").license(new License().name("Apache 2.0").url("http://doc.xiaominfo.com")));}}

启动注入

package com.giser.mp;import java.net.InetAddress;
import java.net.UnknownHostException;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.Environment;import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;@Slf4j
@SpringBootApplication
@MapperScan("com.giser.mp.*.mapper")
public class Knife4jSpringBoot3DemoApplication {private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Knife4jSpringBoot3DemoApplication.class);@SneakyThrowspublic static void main(String[] args) throws UnknownHostException {SpringApplication app=new SpringApplication(Knife4jSpringBoot3DemoApplication.class);ConfigurableApplicationContext application=app.run(args);//ConfigurableApplicationContext application=SpringApplication.run(Knife4jSpringBootDemoApplication.class, args);Environment env = application.getEnvironment();log.info("\n----------------------------------------------------------\n\t" +"Application '{}' is running! Access URLs:\n\t" +"Local: \t\thttp://localhost:{}\n\t" +"External: \thttp://{}:{}\n\t"+"Doc: \thttp://{}:{}/doc.html\n"+"----------------------------------------------------------",env.getProperty("spring.application.name"),env.getProperty("server.port"),InetAddress.getLocalHost().getHostAddress(),env.getProperty("server.port"),InetAddress.getLocalHost().getHostAddress(),env.getProperty("server.port"));}}

应用

package com.giser.mp.web;import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.enums.ParameterIn;
import io.swagger.v3.oas.annotations.tags.Tag;@RestController
@RequestMapping("/api/demo/")
@Tag(name = "接口文档示例")
public class Body1Controller {@Operation(summary = "GET")@ApiOperationSupport(order = 10)@GetMapping("/user/{id}")public ResponseEntity<String> getDemo(@PathVariable("id") String id){return ResponseEntity.ok(null);}@Operation(summary = "POST")@ApiOperationSupport(order = 1)@PostMapping("/m1")public ResponseEntity<String> postDemo(@RequestBody String request){return ResponseEntity.ok(request);}@Operation(summary = "PUT")@ApiOperationSupport(order = 2)@PutMapping("/m12")public ResponseEntity<String> putDemo(@PathVariable("id") String id){return ResponseEntity.ok(id);}@Operation(summary = "DELETE")@ApiOperationSupport(order = 2)@DeleteMapping("/user/{id}")public ResponseEntity<String> deleteDemo(@PathVariable("id") String id){return ResponseEntity.ok(id);}@Operation(summary = "普通body请求")@PostMapping("/body")public ResponseEntity<Object> body(@RequestBody Object fileResp){return ResponseEntity.ok(fileResp);}@Operation(summary = "普通body请求+Param+Header+Path")@Parameters({@Parameter(name = "id",description = "文件id",in = ParameterIn.PATH),@Parameter(name = "token",description = "请求token",required = true,in = ParameterIn.HEADER),@Parameter(name = "name",description = "文件名称",required = true,in=ParameterIn.QUERY)})@PostMapping("/bodyParamHeaderPath/{id}")public ResponseEntity<Object> bodyParamHeaderPath(@PathVariable("id") String id,@RequestHeader("token") String token, @RequestParam("name")String name,@RequestBody Object fileResp){return ResponseEntity.ok(fileResp);}}

参考 Knife4j

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/161077.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go 语言函数、参数和返回值详解

函数是一组语句&#xff0c;可以在程序中重复使用。函数不会在页面加载时自动执行。函数将通过调用函数来执行。 创建函数 要创建&#xff08;通常称为声明&#xff09;一个函数&#xff0c;请执行以下操作&#xff1a; 使用 func 关键字。指定函数的名称&#xff0c;后跟括…

Java编程技巧:if-else优化实践总结归纳

文/朱季谦 说实话&#xff0c;其实我很讨厌在代码里大量使用if-else&#xff0c;一是因为该类代码执行方式属于面向过程的&#xff0c;二嘛&#xff0c;则是会显得代码过于冗余。这篇笔记&#xff0c;主要记录一些自己在工作实践当中针对if-else的优化心得&#xff0c;将会不定…

10年开发工程师总结,8大主流程序员兼职平台,月入30k不是梦!

今年互联网行业陆续裁员减薪&#xff0c;许多人怨声载道的同时也开始另谋出路。而对于程序员更是应该提早做好准备&#xff0c;活跃在兼职接单的最前沿。 我们程序员是一门技术工种&#xff0c;与互联网其他行业相比薪水会相对高一点&#xff0c;不过钱也不是那么好赚的&#…

C++中类和动态内存分配

new关键字 在C中&#xff0c;内存分为栈和堆。栈中的对象生命周期较短&#xff0c;往往在作用域结束后就会销毁&#xff0c;而堆中的对象生命周期较长&#xff0c;只有当使用delete或者程序结束时才会销毁。而new则是将我们创建的对象分配到堆中&#xff0c;使对象可以跨作用域…

2023年【广东省安全员B证第四批(项目负责人)】报名考试及广东省安全员B证第四批(项目负责人)复审考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 广东省安全员B证第四批&#xff08;项目负责人&#xff09;报名考试是安全生产模拟考试一点通总题库中生成的一套广东省安全员B证第四批&#xff08;项目负责人&#xff09;复审考试&#xff0c;安全生产模拟考试一点…

json_to_mask

修改后的json_to_dataset文件&#xff0c;直接复制替换你自己原始的json_to_dataset&#xff0c;建议保存一下原版import argparse import base64 import json import os import os.path as ospimport imgviz import PIL.Imagefrom labelme.logger import logger from labelme …

java:springboot单元测试spring-boot-starter-test

背景 Java的单元测试可以使用多个框架&#xff0c;其中比较流行的包括&#xff1a; JUnit&#xff1a;JUnit是Java单元测试最常用的框架&#xff0c;它提供了一套丰富的API&#xff0c;可以方便地编写测试用例和测试套件。JUnit 5是JUnit的最新版本&#xff0c;引入了许多新功…

ElMessageBox中的子组件回调关闭函数

父组件中&#xff1a; const closeMessageBox () > {ElMessageBox.close();getList(); };const open () > {ElMessageBox({title: 添加商品,message: h(AddTaxExemption, { onClose: closeMessageBox }),customClass: custom-message-box, showConfirmButton: false,d…

各大电商平台双十一“狂飙”,如何选择商城系统?

今年是“双十一”的第十五年。作为各大平台和品牌的全年最重要的营销节点&#xff0c;品牌们可谓是来势汹汹&#xff0c;各种促销活动和优惠力度让人眼花缭乱。 淘天数据显示&#xff0c;天猫促销活动开售当晚&#xff0c;155个品牌开卖成交额突破1亿元&#xff1b;首小时内7.1…

str转wstr的三种方法和从网站获取json数据到数据随机提取,返回拼接字符串和动态数组

库的设置 hv库 外部包含目录&#xff1a;…\include\libhv_new\hv; 库目录&#xff1a;…\include\libhv_new\lib\x86\Release; 附加依赖项&#xff1a;hv.lib; //Get请求 获取json数据&#xff0c;然后提取符合 条件的&#xff0c;time值大于自定义变量的值&#xff0c;然后取…

【UE】用样条线实现测距功能(上)

目录 效果 步骤 一、创建样条网格体组件3D模型 二、实现点击连线功能 三、实现显示两点间距离功能 效果 步骤 一、创建样条网格体组件3D模型 创建一个圆柱模型&#xff0c;这里底面半径设置为10mm&#xff0c;高度设置为1000mm 注意该模型的坐标轴在如下位置&#xff1…

基于pytest的服务端http请求的自动化测试框架?

1、引言 我有一个朋友是做 Python 自动化测试的。前几天他告诉我去参加一个大厂面试被刷了。 我问他是有没有总结被刷下来的原因。他说面试官问了一些 pytest 单元测试框架相关的知识&#xff0c;包括什么插件系统和用力筛选。但是他所在的公司用的技术是基于 unittest 的&am…

Sentinel与SpringBoot整合

好的&#xff0c;以下是一个简单的Spring Cloud整合Sentinel的代码示例&#xff1a; 首先&#xff0c;在pom.xml中添加以下依赖&#xff1a; <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel&l…

swift-基础

print区别 print(1,2,3, separator: "-", terminator: "\n")//表示用-来分割//1-2-3 //terminator表示用\n作为终止符 var a "a",b "b" print(a b) //ab print("\(a)前面是a变量\(b)后面是b变量")变量 var name "…

Win10系统无法登录Xbox live的四种解决方法

在Win10系统中&#xff0c;用户可以登录Xbox live平台&#xff0c;畅玩自己喜欢的游戏。但是&#xff0c;有用户却遇到了无法登录Xbox live的问题。接下来小编给大家详细介绍四种简单的解决方法&#xff0c;解决后用户在Win10电脑上就能成功登录上Xbox live平台。 Win10系统无法…

Linux编程 文件操作 creat open

文件描述符 文件描述符在形式上是一个非负整数。实际上&#xff0c;它是一个索引值&#xff0c;指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时&#xff0c;内核向进程返回一个文件描述符。 启动一个进程之后&#xff0c;…

SquareCTF-2023 Web Writeups

官方wp&#xff1a;CTFtime.org / Square CTF 2023 tasks and writeups sandbox Description&#xff1a; I “made” “a” “python” “sandbox” “”“” nc 184.72.87.9 8008 先nc连上看看&#xff0c;只允许一个单词&#xff0c;空格之后的直接无效了。 flag就在当…

(C)一些题2

1.在 C 语言中&#xff08;以 16位 PC 机为例&#xff09;,5种基本数据类型的存储空间长度的顺序为&#xff08;&#xff09; A . char < int < long int <float < double B . char int < long int<float <double C . char < int < long int …

inux应用开发基础知识——串口应用编程(十一)

前言&#xff1a; 在Linux系统中&#xff0c;串口设备以文件的形式存在&#xff0c;通常位于/dev目录下&#xff0c;如ttyS0、ttyUSB0等。这些设备文件可以用于读取和写入数据。要使用串口设备&#xff0c;需要打开相应的设备文件。在打开串口时&#xff0c;可以使用O_RDWR选项…

哈夫曼树你需要了解一下

哈夫曼树介绍哈夫曼数特点哈夫曼应用场景哈夫曼构建过程哈夫曼树示例拓展 哈夫曼树介绍 哈夫曼树&#xff08;Huffman Tree&#xff09;是一种特殊的二叉树&#xff0c;也被称为最优二叉树。在计算机科学中&#xff0c;它是由权值作为叶子节点构造出来的一种二叉树。哈夫曼树的…