如何调试Spring Boot MVC Controller的URL映射?及Web模块问题排查
嘿,我明白你现在的困扰——Tomcat和DispatcherServlet都正常启动了,但Controller的URL就是访问不到,这种情况在Spring Boot集成多组件时确实容易碰到。下面给你梳理几个实用的调试步骤,一步步排查问题:
先检查Controller的基础配置是否正确
别笑,有时候最基础的地方最容易忽略:- 确保你的Controller类上标注了
@RestController(如果是返回JSON/REST接口)或者@Controller(如果是视图渲染),二者选其一,不能缺! - 方法上的
@GetMapping/@PostMapping/@RequestMapping路径有没有写错?比如是不是多写了斜杠,或者路径和其他映射冲突了? - 检查Spring Boot主类的包扫描范围:如果你的Controller在主类所在包的子包下(比如主类在
com.example,Controller在com.example.controller),那默认会被扫描到;如果不在,记得在主类上加上@ComponentScan(basePackages = {"你的Controller所在包"})。
- 确保你的Controller类上标注了
开启Spring MVC的调试日志,看映射细节
默认的日志级别可能看不到URL映射的具体注册情况,直接在application.properties里加这两行:logging.level.org.springframework.web=DEBUG logging.level.org.springframework.context.annotation=DEBUG重启应用后,你会在日志里看到DispatcherServlet加载的所有
HandlerMapping信息,里面会明确列出哪些Controller的方法被映射到了哪些URL。如果你的Controller方法没出现在列表里,那说明它根本没被Spring容器扫描到,回到第一步检查包扫描和注解。排查拦截器/过滤器/安全框架的影响
- 如果你的项目里加了自定义的
Filter或者Interceptor,检查它们的逻辑是不是把请求拦截了,比如有没有在过滤器里直接返回了响应,没让请求到达Controller。 - 要是引入了Spring Security,一定要确认你的Controller路径在授权规则里是允许访问的!比如在Security配置类里加上:
@Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/your-controller-path/**").permitAll() // 替换成你的实际路径 .anyRequest().authenticated(); }
- 如果你的项目里加了自定义的
用Actuator端点直观查看所有映射
要是你愿意,可以引入spring-boot-starter-actuator依赖,然后配置暴露mappings端点:management.endpoints.web.exposure.include=mappings management.endpoint.mappings.enabled=true启动后访问
http://localhost:8080/actuator/mappings(端口换成你自己的应用端口),就能看到所有已注册的URL映射,包括每个映射对应的Controller类和方法,一目了然。断点调试,跟踪请求流程
要是上面的方法还没找到问题,直接上断点:- 在你的Controller方法第一行加断点,看请求有没有进来;
- 或者在
DispatcherServlet的doDispatch方法里加断点,跟踪请求从进入到处理的全过程,看看是在哪一步被拦截或者没匹配到映射。
检查自动配置是否被覆盖
如果你自己加了@EnableWebMvc注解,那Spring Boot的默认WebMvc自动配置会被覆盖,这时候要检查你的WebMvcConfigurer实现有没有错误,比如是不是不小心覆盖了默认的映射规则,或者没正确注册视图解析器(如果是用@Controller返回视图的话)。
内容的提问来源于stack exchange,提问作者Shankar

