Spring Boot 1.5迁移2.0后Web服务出现404/405错误求助
刚帮朋友踩过Spring Boot 1.5升2.0的坑,结合你遇到的GET 404、POST 405的问题,咱们一步步排查:
核心排查方向及解决方案
1. 路径匹配规则的重大变化(最常见原因)
Spring Boot 2.0把Spring MVC默认的路径匹配策略从AntPathMatcher换成了PathPatternParser,这个改动会直接影响请求和Controller注解路径的匹配逻辑,尤其是带尾斜杠、点号的路径。
- 先快速验证:在
application.properties里添加配置:
重启服务后测试请求,如果问题解决,说明是路径匹配规则导致的,接下来需要调整你的spring.mvc.pathmatch.matching-strategy=ant_path_matcher@GetMapping/@PostMapping路径写法(比如去掉不必要的尾斜杠,规范路径格式)。
2. Undertow配置的兼容性问题
你用的是Undertow容器,Spring Boot 2.0对Undertow的配置项做了不少调整,旧版本的配置可能会干扰请求处理:
- 检查配置文件里有没有遗留的1.5版本Undertow参数,比如
server.undertow.access-log-pattern这类,换成2.0对应的写法; - 可以先暂时清空Undertow的自定义配置,只保留必要的端口、上下文路径配置,排除配置冲突的可能。
3. Spring Security拦截规则的隐性冲突
你说Security过滤器正常工作,但很可能是Security的拦截规则把请求挡住了,导致请求根本没到Controller层:
- 检查你的Security配置类,Spring Boot 2.0里
WebSecurityConfigurerAdapter的默认行为有变化,比如默认拦截的路径范围; - 临时放宽拦截规则测试:在
configure(HttpSecurity http)方法里添加.antMatchers("/**").permitAll(),如果此时Controller能正常响应,说明是Security的规则限制了请求; - 别忘了开启Security的DEBUG日志,能看到具体的拦截流程。
4. Controller组件扫描失效
Spring Boot 2.0的组件扫描逻辑虽然变化不大,但如果启动类位置不对,会导致Controller无法被扫描到:
- 确认带
@SpringBootApplication的启动类在根包下(比如你的Controller在com.example.api,启动类要在com.example); - 如果启动类位置不合适,在
@SpringBootApplication里显式指定扫描范围:@SpringBootApplication(scanBasePackages = {"com.example.api", "com.example.security"}); - 再检查一遍Controller类上有没有加
@RestController(或@Controller + @ResponseBody),别漏加注解导致组件不被识别。
5. 依赖版本冲突
确保所有Spring生态的依赖版本和Spring Boot 2.0的版本一致,尤其是Undertow、Spring MVC、Spring Security:
- 用Maven的
mvn dependency:tree或Gradle的./gradlew dependencies查看依赖树,排查有没有版本不一致的依赖; - 尽量用Spring Boot的父依赖来统一管理版本,避免手动指定Undertow等组件的版本,减少冲突。
6. 上下文路径的实际生效验证
你已经把server.context-path改成了server.servlet.context-path,但要确认请求时是否带上了正确的上下文路径:
- 查看启动日志,Undertow会输出类似
Undertow started on port(s) 8080 (http) with context path '/your-app'的日志,确认上下文路径配置生效; - 请求时要带上这个路径,比如配置的是
/my-app,那GET请求应该是http://localhost:8080/my-app/your-api,而不是直接访问/your-api。
辅助调试技巧
开启Spring MVC和Security的DEBUG日志,能清晰看到请求的处理流程,帮你快速定位问题:
logging.level.org.springframework.web=DEBUG logging.level.org.springframework.security=DEBUG
日志里会显示请求是否进入DispatcherServlet、有没有匹配到Controller方法、Security是否拦截了请求等关键信息。
内容的提问来源于stack exchange,提问作者asyncmind
相关产品推荐
相关产品推荐

