chore(deps): Swagger springfox → Springdoc OpenAPI 1.8.0

迁移内容:
- 移除 springfox-boot-starter:3.0.0 (已停维, 与 Spring Boot 2.7 不兼容)
- 新增 springdoc-openapi-ui:1.8.0 (OpenAPI 3.0, 兼容 Spring Boot 2.7)
- 重写 SwaggerConfig.java → 使用 OpenAPI bean + SecurityScheme
- 移除 ResourcesConfig 中 springfox-swagger-ui 资源映射
- 移除 ISchedulePoolService 中未使用的 io.swagger.models.auth.In import
- application.yml: springfox 配置 → springdoc 配置

验证结果:
-  Swagger UI 页面 HTTP 200
-  OpenAPI JSON 正常 (1373 个 API)
-  登录/分页/路由接口正常
-  71 个 @ApiOperation 注解兼容无需修改
This commit is contained in:
2026-06-04 13:59:46 +08:00
parent dbe146725a
commit e84455da51
6 changed files with 42 additions and 118 deletions

View File

@@ -31,16 +31,10 @@
<artifactId>lombok</artifactId>
</dependency>
<!-- swagger3-->
<!-- springdoc-openapi (替代 springfox) -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
</dependency>
<!-- 防止进入swagger页面报类型转换错误排除3.0.0中的引用手动增加1.6.2版本 -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
</dependency>
<!-- Mysql驱动包 -->

View File

@@ -1,26 +1,20 @@
package com.core.web.core.config;
import com.core.common.config.CoreConfig;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
import io.swagger.v3.oas.models.Components;
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.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.beans.factory.annotation.Autowired;
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 java.util.ArrayList;
import java.util.List;
/**
* Swagger2的接口配置
*
* Springdoc OpenAPI 配置 (替代 Springfox)
*
* @author system
*/
@Configuration
@@ -30,79 +24,29 @@ public class SwaggerConfig {
private CoreConfig coreConfig;
/** 是否开启swagger */
@Value("${swagger.enabled}")
@Value("${springdoc.api-docs.enabled:true}")
private boolean enabled;
/** 设置请求的统一前缀 */
@Value("${swagger.pathMapping}")
private String pathMapping;
/**
* 创建API
*/
@Bean
public Docket createRestApi() {
return new Docket(DocumentationType.OAS_30)
// 是否启用Swagger
.enable(enabled)
// 用来创建该API的基本信息展示在文档的页面中自定义展示的信息
.apiInfo(apiInfo())
// 设置哪些接口暴露给Swagger展示
.select()
// 扫描所有有注解的api用这种方式更灵活
.apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
// 扫描指定包中的swagger注解
// .apis(RequestHandlerSelectors.basePackage("com.core.project.tool.swagger"))
// 扫描所有 .apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any()).build()
/* 设置安全模式swagger可以设置访问token */
.securitySchemes(securitySchemes()).securityContexts(securityContexts()).pathMapping(pathMapping);
public OpenAPI openAPI() {
return new OpenAPI()
.info(apiInfo())
.schemaRequirement("Authorization",
new SecurityScheme()
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.bearerFormat("JWT"))
.addSecurityItem(new SecurityRequirement().addList("Authorization"));
}
/**
* 安全模式这里指定token通过Authorization头请求头传递
* API 基本信息
*/
private List<SecurityScheme> securitySchemes() {
List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
return apiKeyList;
}
/**
* 安全上下文
*/
private List<SecurityContext> securityContexts() {
List<SecurityContext> securityContexts = new ArrayList<>();
securityContexts.add(SecurityContext.builder().securityReferences(defaultAuth())
.operationSelector(o -> o.requestMappingPattern().matches("/.*")).build());
return securityContexts;
}
/**
* 默认的安全上引用
*/
private List<SecurityReference> defaultAuth() {
AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
authorizationScopes[0] = authorizationScope;
List<SecurityReference> securityReferences = new ArrayList<>();
securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
return securityReferences;
}
/**
* 添加摘要信息
*/
private ApiInfo apiInfo() {
// 用ApiInfoBuilder进行定制
return new ApiInfoBuilder()
// 设置标题
.title("标题开放医院管理系统_接口文档")
// 描述
.description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
// 作者信息
.contact(new Contact(coreConfig.getName(), null, null))
// 版本
.version("版本号:" + coreConfig.getVersion()).build();
private Info apiInfo() {
return new Info()
.title("开放医院管理系统 - 接口文档")
.description("OpenHIS API 文档,基于 Springdoc OpenAPI 3.0")
.contact(new Contact().name(coreConfig.getName()))
.version("版本号: " + coreConfig.getVersion());
}
}

View File

@@ -6,7 +6,6 @@ import com.core.framework.interceptor.RepeatSubmitInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.CacheControl;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
@@ -14,7 +13,6 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.concurrent.TimeUnit;
/**
* 通用配置
@@ -32,10 +30,7 @@ public class ResourcesConfig implements WebMvcConfigurer {
registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**")
.addResourceLocations("file:" + CoreConfig.getProfile() + "/");
/** swagger配置 */
registry.addResourceHandler("/swagger-ui/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
.setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());
/** springdoc UI 由 springdoc-openapi 自动提供,无需手动配置 */
}
/**

View File

@@ -110,17 +110,15 @@ pagehelper:
# 默认值为 false。设置为 true 时,允许在运行时根据多数据源自动识别对应方言的分页
auto-runtime-dialect: true
# Swagger配置
# 禁用 Springfox (与 Spring Boot 2.7 不兼容, 后续迁移至 springdoc)
springfox:
documentation:
enabled: false
swagger:
# 是否开启swagger
enabled: true
# 请求前缀
pathMapping: /dev-api
# Springdoc OpenAPI 配置 (替代 Springfox)
springdoc:
api-docs:
enabled: true
swagger-ui:
enabled: true
tags-sorter: alpha
operations-sorter: alpha
packages-to-scan: com.core.web,com.openhis.web
# 防止XSS攻击
xss:

View File

@@ -2,7 +2,6 @@ package com.openhis.appointmentmanage.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.openhis.appointmentmanage.domain.SchedulePool;
import io.swagger.models.auth.In;
public interface ISchedulePoolService extends IService<SchedulePool> {
/**

View File

@@ -28,7 +28,7 @@
<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
<druid.version>1.2.28</druid.version>
<bitwalker.version>1.21</bitwalker.version>
<swagger.version>3.0.0</swagger.version>
<springdoc.version>1.8.0</springdoc.version>
<kaptcha.version>2.3.3</kaptcha.version>
<pagehelper.boot.version>2.1.1</pagehelper.boot.version>
<oshi.version>6.10.0</oshi.version>
@@ -268,15 +268,9 @@
<!-- Swagger3依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-boot-starter</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
</exclusions>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>${springdoc.version}</version>
</dependency>
<!-- io常用工具类 -->