Spring Boot 3.0.0部署Nginx反向代理后出现404错误求助
问题:Spring Boot 3.0.0升级后Nginx反向代理下出现404错误
我有一个部署在Nginx反向代理后的Spring Boot应用,将版本从2.7.0升级到3.0.0后出现404错误。
Nginx反向代理配置
location /cpoprocesscontrol { proxy_pass http://spring-docker-container-name:8014/; proxy_http_version 1.1; # don't cache it proxy_no_cache 1; # even if cached, don't try to use it proxy_cache_bypass 1; # Proxy headers proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Port $server_port; # Proxy headers # Proxy timeouts proxy_connect_timeout 3600s; proxy_send_timeout 3600s; proxy_read_timeout 3600s; }
添加的Swagger相关依赖
<dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.0.2</version> </dependency>
访问地址与错误响应
访问的API地址:
https://company-name/cpoprocesscontrol/workflow/getAllWorkflowContainingNamePageable?page=0&size=20
得到的404响应:
{"timestamp":1674146900016, "status":404, "error":"Not Found", "path":"//workflow/getAllWorkflowContainingNamePageable"}
Nginx版本为1.19.7,请问版本升级中哪些改动会导致该问题?
问题分析与解决方案
核心原因1:Springfox与Spring Boot 3.0不兼容
Springfox 3.0仅支持基于Java EE的Spring Boot 2.x版本,而Spring Boot 3.0全面迁移到Jakarta EE(替代原Java EE规范),Servlet API包路径从javax.servlet变为jakarta.servlet,导致Springfox无法正常加载,干扰Spring MVC的路由映射注册,部分API无法被正确识别。
同时你同时引入了Springfox和SpringDoc两套Swagger工具,这会引发依赖冲突和路由处理冲突,进一步加剧路径匹配异常。
核心原因2:路径解析的双斜杠问题
错误响应中的path为//workflow/getAllWorkflowContainingNamePageable,说明请求路径被解析为双斜杠。原因在于:
- Nginx配置中
proxy_pass末尾带有斜杠/,会将location匹配的/cpoprocesscontrol替换为/,原请求/cpoprocesscontrol/workflow/...会被转发为/workflow/... - Spring Boot 3.0对路径匹配的规则更严格,当应用未设置
server.servlet.context-path时,转发过来的/workflow/...可能被错误解析为双斜杠路径,导致路由匹配失败。
修复步骤
移除所有Springfox依赖,仅保留SpringDoc依赖(SpringDoc是Spring Boot 3.x官方推荐的OpenAPI/Swagger工具):
<dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.0.2</version> </dependency>调整Nginx代理配置或Spring Boot上下文路径:
- 方案一:修改Nginx的
proxy_pass,去掉末尾的斜杠,让完整路径传递给后端:location /cpoprocesscontrol { proxy_pass http://spring-docker-container-name:8014; # 其余配置保持不变 } - 方案二:在Spring Boot配置文件中设置上下文路径,与Nginx的
location匹配:
此时Nginx的server.servlet.context-path=/cpoprocesscontrolproxy_pass可以保留末尾斜杠,请求路径会被正确映射。
- 方案一:修改Nginx的
验证路由映射:启动应用后,通过SpringDoc的UI(默认地址
/swagger-ui.html)检查API是否正常注册,确认所有接口的路径与请求地址匹配。
内容的提问来源于stack exchange,提问作者Aldo Inácio da Silva
相关产品推荐
相关产品推荐

