You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何DispatcherServlet无法将请求转发至RestController?

问题排查:DispatcherServlet无法映射请求到RestController的原因

核心缺失点分析

1. 未给DispatcherServlet关联Spring WebApplicationContext

编程式配置时,DispatcherServlet需要明确绑定Spring的Web容器才能识别Controller的映射规则。如果只是初始化了根Spring容器,但没把它关联到DispatcherServlet,后者会用默认空容器,自然找不到@RestController的映射。

修正示例:

// 创建Spring Web专用容器
AnnotationConfigWebApplicationContext webContext = new AnnotationConfigWebApplicationContext();
webContext.register(WebConfig.class); // 注册包含Controller扫描的配置类

// 绑定容器到DispatcherServlet
DispatcherServlet dispatcherServlet = new DispatcherServlet(webContext);

// 注册到Tomcat并设置映射路径
Tomcat.addServlet(context, "dispatcher", dispatcherServlet);
context.addServletMappingDecoded("/*", "dispatcher"); // 确保映射覆盖请求路径

2. 配置类未启用@EnableWebMvc

@EnableWebMvc是Spring MVC的核心开关,它会自动导入请求映射处理器(RequestMappingHandlerMapping)、请求适配器(RequestMappingHandlerAdapter)等关键组件。没有这个注解,@GetMapping这类注解的映射规则不会被解析。

在配置类中添加:

@Configuration
@ComponentScan(basePackages = "com.your.controller.package") // 指定Controller所在包
@EnableWebMvc
public class WebConfig {
}

3. DispatcherServlet的映射路径不匹配

如果DispatcherServlet的映射路径设为/dispatcher/*这类窄路径,而你的请求是/hello,请求根本不会被DispatcherServlet接收。必须确保映射路径覆盖目标请求,比如设置为/*来处理所有请求。

4. 组件扫描范围未包含RestController

如果配置类的@ComponentScan没有指定正确的包路径,即使根Spring容器初始化了Controller,DispatcherServlet关联的Web容器也无法加载它,导致映射丢失。必须保证扫描范围包含你的@RestController所在包。

验证方法

  • 启动后查看日志,若没有Mapped "{[/hello],methods=[GET]}"的输出,说明映射未成功注册
  • 调试时检查DispatcherServlet关联的WebApplicationContext中是否存在你的Controller实例

内容的提问来源于stack exchange,提问作者jabrena

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 14:34:57