SpringBoot2.7 OpenApi3如何配置多环境自定义Swagger上下文路径
原方案失效原因
- 事件触发时机错误:
ApplicationPreparedEvent执行时,Spring上下文已经完成Bean定义加载、自动配置类属性绑定,springdoc相关的路径配置已经完成初始化,此时再往Environment中插入属性不会触发配置重新加载,自然不会生效。另外你同时给监听器加了@Component注解又在启动类手动注册,会导致监听器重复执行两次,存在逻辑冲突。 - 配置项理解偏差:
springdoc.swagger-ui.path配置的是Swagger UI相对于应用服务context-path的访问路径,不支持配置跨环境的全量路径。你给dev环境配置的/dev/api/myApp/swagger-ui/index.html是绝对路径,会和已配置的server.servlet.context-path=/api/myApp重复拼接路径段,直接导致页面404。 - 路径拼接逻辑错误:qat、uat环境的返回值只写了
/api/myApp/,没有拼接Swagger UI的静态资源路径,根本无法定位到页面资源。
正确配置方案
你需要的多环境访问路径差异本质是网关层的路由前缀差异,应用本身不需要修改context-path,只需要让springdoc正确识别网关转发的前缀即可,操作步骤如下:
- 删除自定义的
SwaggerListener监听器,不需要通过监听事件手动注入属性。 - 保留公共配置不变,使用SpringBoot原生多环境配置文件区分环境参数:
- 主配置文件
application.properties保留原有基础配置:
spring.application.name=myApp server.servlet.context-path=/api/${spring.application.name} # swagger公共路径配置 springdoc.swagger-ui.path=/swagger-ui/index.html springdoc.api-docs.path=/v3/api-docs- dev环境新建
application-dev.properties,开启转发头识别并适配/dev路由前缀:
# 开启反向代理转发头识别,自动适配网关前缀 server.forward-headers-strategy=native springdoc.swagger-ui.config-url=/dev/api/myApp/v3/api-docs springdoc.swagger-ui.url=/dev/api/myApp/v3/api-docs- qat、uat环境分别新建
application-qat.properties、application-uat.properties,只需要开启转发头识别即可,不需要额外修改路径:
server.forward-headers-strategy=native - 主配置文件
- 网关层(Nginx/Ingress/API网关)配置转发规则时,dev环境转发到后端服务需要携带
X-Forwarded-Prefix: /dev请求头,SpringBoot会自动将此前缀拼接到所有web资源的返回路径中,不需要在应用层硬编码全路径。 - 修正SwaggerConfig配置,补全Info参数即可正常使用:
@Configuration @Profile({ "local", "dev", "qat", "uat" }) public class SwaggerConfig { @Bean public OpenAPI openAPI() { return new OpenAPI() .info(new Info() .title("MyApp接口文档") .version("1.0.0") .license(new License().name("Apache 2.0"))); } }
补充说明:如果qa、uat环境是应用直接对外暴露服务、没有网关前缀转发,那现有配置不需要任何调整,直接访问
域名+context-path+/swagger-ui/index.html即可,和你预期的访问规则完全匹配。
内容的提问来源于stack exchange,提问作者Sachin Pandey
相关产品推荐
相关产品推荐

