项目想使用jdk21的虚拟线程,所以适配的springboot版本,也升级到3.4.0
1、pom.xml修改
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.4.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>6.2.11</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>4.5.0</version>
</dependency>
...
</dependencies>
pom.xml里只要像上面写了后,重启应用,就能直接访问 http://localhost:90/doc.html了。不用在application-dev.yml里定义什么,也不用 在/config下 写什么自动被扫描的Bean。。。
如果要:加个访问密码,定义下api的作者,版本,联系人的什么的,还是要写一个Bean的。
2、如果要把它映射到通过nginx控制的外网
2.1、 强制给它加一个context path(如果nginx下有很多应用,为了区别开)
这个主要是有的时候想给这个knife4j的默认根目录前加个前缀,怎么弄都不成功,不知道为何,所以另寻思路。如果不更改根目录,通过nginx做代理又很麻烦、指令会很复杂。
研究发现,在springboot3的 application-dev.yml 里写server.servlet.context-path不起作用(不识别这个配置项)。但是在启动脚本里,这样写:java -jar myapp.jar --server.servlet.context-path=/myapp 还是起作用的。
2.2、 nginx写转发
location /myapp/doc.html {
proxy_pass http://10.102.142.24:90/myapp/doc.html ;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
}
location /myapp/webjars/ {
proxy_pass http://10.102.142.24:90/myapp/webjars/ ;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
}
location /myapp/v3/ {
proxy_pass http://10.102.142.24:90/myapp/v3/ ;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
}
location /myapp/ {
proxy_pass http://10.102.142.24:90/myapp/ ;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
}
3、定义api的作者,版本。。。
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.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Knife4j整合Swagger3 Api接口文档配置类
* @author wangzheng
*/
@Configuration
public class Knife4jConfig {
/**
* 创建了一个api接口的分组
* 除了配置文件方式创建分组,也可以通过注册bean创建分组
*/
@Bean
public GroupedOpenApi adminApi() {
return GroupedOpenApi.builder()
// 分组名称
.group("default")
// 接口请求路径规则
.pathsToMatch("/**")
.build();
}
/**
* 配置基本信息
*/
@Bean
public OpenAPI openAPI() {
return new OpenAPI()
.info(new Info()
// 标题
.title("MyApp API")
// 描述Api接口文档的基本信息
.description("MyApp API")
// 版本
.version("v1.0")
// 设置OpenAPI文档的联系信息,姓名,邮箱。
.contact(new Contact().name("WangZheng").email("wang@qq.com"))
// 设置OpenAPI文档的许可证信息,包括许可证名称为"Apache 2.0",许可证URL为"http://springdoc.org"。
.license(new License().name("Apache 2.0").url("http://springdoc.org"))
);
}
}
4、其它的额外配置,还是要写到application-dev.yml
# 以下不能打开,否则报错 重复的swagger对象。这里仅仅做参考
#springdoc:
# swagger-ui:
# path: /swagger-ui.html
# tags-sorter: alpha
# operations-sorter: alpha
# api-docs:
# path: /v3/api-docs
# enabled: true #是否开启文档功能
# group-configs:
# - group: 'default'
# paths-to-match: '/**'
# packages-to-scan: com.myapp.controller
# knife4j
knife4j:
enable: true
production: false # 这个恒久是flase,不能改成true。即使在appliction-prd.yml也是false。有歧义的一个配置项
#是否启用登录认证
basic:
enable: true
username: admin
password: 123456
setting:
language: zh_cn
enable-version: true
enable-swagger-models: true
swagger-model-name: 用户模块