Spring Boot 2.1升级至2.5后Swagger/OpenAPI使用异常问题求助
我来帮你搞定这两个升级后遇到的Swagger问题,咱们逐个分析解决:
问题1:访问Swagger页面提示"No API definition provided"
这个问题通常是API文档生成路径或Swagger UI配置不匹配导致的,结合你的配置来看,可能有以下几个原因和解决办法:
1.1 确认API文档接口可正常访问
首先直接访问你配置的/api-docs路径(比如http://localhost:8081/api-docs),如果返回的是结构化的OpenAPI JSON数据,说明文档生成没问题;如果访问不到,那大概率是缺少基础的OpenAPI配置Bean,需要添加:
@Configuration public class OpenApiConfig { @Bean public OpenAPI customOpenAPI() { return new OpenAPI() .info(new Info() .title("你的API名称") .version("1.0") .description("你的API描述")); } }
这个Bean是springdoc-openapi生成API文档的基础,没有它可能无法正确生成接口定义。
1.2 调整Swagger UI的访问路径匹配配置
你的application.yml里配置了springdoc.swagger-ui.path: /swagger.html,但你访问的是/swagger-ui/index.html,路径不匹配自然加载不到API定义。你有两个选择:
- 直接访问配置的路径:
http://localhost:8081/swagger.html - 修改配置让Swagger UI使用你习惯的路径:
springdoc: swagger-ui: path: /swagger-ui/index.html
另外,你设置了disable-swagger-default-url: true,这会禁用默认的/swagger-ui.html路径,所以一定要保证配置的path和你访问的路径一致。
问题2:Swagger发起请求时的CORS错误(HTTP/HTTPS协议不匹配)
你推测的原因是对的——Swagger页面加载时用了HTTPS,但发起接口请求时自动用了HTTP,协议不一致导致跨域(直接浏览器/Postman调用是因为请求和页面同协议,或者Postman不做跨域校验)。解决办法是强制Swagger使用正确的协议发起请求:
2.1 在OpenAPI配置中指定Server地址
修改刚才的OpenApiConfig,添加Server配置,指定HTTPS的基础地址:
@Bean public OpenAPI customOpenAPI() { return new OpenAPI() .info(new Info() .title("你的API名称") .version("1.0") .description("你的API描述")) .addServersItem(new Server().url("https://localhost:8081")); // 替换成你的实际HTTPS地址 }
这样Swagger会用这个地址作为接口请求的基础URL,避免协议不匹配。
2.2 或者通过application.yml配置server-url
如果不想写Java代码,也可以在配置文件中直接指定:
springdoc: swagger-ui: server-url: https://localhost:8081
这个配置会让Swagger UI所有的接口请求都基于这个URL发起,确保和页面协议一致。
另外补充一下:你的WebConfig里的CORS配置只指定了允许的方法,但没有明确设置allowedOrigins,不过Spring默认会允许所有来源;但核心问题是协议不匹配,所以上面的Server配置才是解决这个CORS错误的关键。
内容的提问来源于stack exchange,提问作者sonoerin

