Spring Boot @RestController 404:PaymentController部署后无法访问问题
问题分析与解决方案
本地运行时两个RestController均可正常访问,但部署后仅PaymentMethodController可用,PaymentController请求返回404,结合代码和场景,可从以下几个方向排查:
1. 常量拼接的实际路径验证
API和NO_AUTH这两个常量的取值在本地与部署环境可能存在差异,导致最终的请求路径不匹配:
- 在
PaymentController的构造方法或启动类中添加日志,输出拼接后的完整路径:log.info("PaymentController base path: {}", API + NO_AUTH + "/payments"); - 对比本地和部署环境的日志输出,确认路径是否一致,比如是否部署环境多了上下文前缀,或者常量值被环境变量覆盖。
2. 组件扫描与打包完整性检查
- 确认Spring Boot主类
ApplicationStarter的@ComponentScan覆盖了控制器所在的包:默认情况下主类所在根目录及子包都会被扫描,若控制器在非子包路径下,需手动指定@ComponentScan(basePackages = "你的控制器包路径")。 - 解压部署包(jar/war),检查
BOOT-INF/classes(jar包)或WEB-INF/classes(war包)中是否存在PaymentController.class文件,排除打包时遗漏类的情况。
3. 路径匹配优先级与日志调试
开启Spring MVC的调试日志,查看请求匹配过程:
- 在部署环境的配置文件中添加:
logging.level.org.springframework.web=DEBUG - 发起
PaymentController的请求,查看日志中是否有路径匹配的记录,确认请求是否被其他处理器(比如错误控制器)拦截,或者路径匹配规则是否与预期不符。
4. 上下文路径与请求URL正确性
- 检查部署环境是否设置了
server.servlet.context-path(比如Tomcat的上下文路径),若有,请求URL需要加上该前缀。例如本地请求/api/no-auth/payments/create,部署后上下文路径为/app,则需请求/app/api/no-auth/payments/create。 - 确认请求方法是否正确:
PaymentController的接口都是@PostMapping,需确保请求使用POST方法,而非GET。
5. 拦截器/安全配置排查
若项目使用Spring Security或自定义拦截器:
- 检查安全配置中是否放行了
/payments/**路径,避免因权限拦截导致返回404(部分拦截器配置错误会返回404而非403)。 - 排查自定义拦截器是否过滤了
PaymentController的请求路径,导致请求未到达控制器。
内容的提问来源于stack exchange,提问作者Pranay Tripathi
相关产品推荐
相关产品推荐

