迁移至Spring Boot 1.5.4后,移除显式Dispatcher Servlet遇404问题求助
你遇到的核心问题是:移除自定义的DispatcherServlet Bean后,Spring Boot默认的DispatcherServlet没有继承原有的映射规则和初始化参数,再加上项目里还有DwrServlet、CXFServlet等其他Servlet共存,最终导致API访问出现404。下面一步步帮你解决:
1. 理清Spring Boot默认DispatcherServlet的自动配置逻辑
你的主类已经添加了@EnableAutoConfiguration,Spring Boot的DispatcherServletAutoConfiguration会自动注册默认的DispatcherServlet,但它的默认映射路径是/*,而你原来的自定义Bean映射的是/app/*——这就是访问404的最直接原因。
2. 配置默认DispatcherServlet的映射与初始化参数
在项目中添加或修改application.properties文件,配置以下内容,让默认DispatcherServlet和你原来的自定义Bean行为完全一致:
# 映射路径和原自定义Bean保持一致 spring.mvc.servlet.path=/app/* # 对应原Bean设置的上下文属性初始化参数 spring.mvc.servlet.init-parameters.contextAttribute=org.springframework.web.context.WebApplicationContext.ROOT # 启动加载顺序和原Bean的loadOnStartup=1对齐 spring.mvc.servlet.load-on-startup=1
3. 正确注册其他Servlet(DwrServlet、CXFServlet)
因为项目里还有其他自定义Servlet,需要用ServletRegistrationBean手动注册它们,确保各自的映射路径和DispatcherServlet不冲突。举两个示例:
注册DwrServlet
@Bean public ServletRegistrationBean dwrServlet() { ServletRegistrationBean registrationBean = new ServletRegistrationBean(new DwrServlet(), "/dwr/*"); registrationBean.setLoadOnStartup(2); // 可以设置比DispatcherServlet稍晚的启动顺序 // 按需添加DwrServlet的初始化参数 registrationBean.addInitParameter("debug", "true"); registrationBean.addInitParameter("activeReverseAjaxEnabled", "true"); return registrationBean; }
注册CXFServlet
@Bean public ServletRegistrationBean cxfServlet() { ServletRegistrationBean registrationBean = new ServletRegistrationBean(new CXFServlet(), "/services/*"); registrationBean.setLoadOnStartup(2); return registrationBean; }
4. 验证主类配置
你的主类已经正确继承了SpringBootServletInitializer(这是部署到外部Tomcat的必要条件),确保@SpringBootConfiguration、@ComponentScan和@ImportResource的配置覆盖了所有需要加载的组件和XML配置。如果某些自动配置和你的自定义逻辑冲突,可以通过@EnableAutoConfiguration(exclude = {XXXAutoConfiguration.class})排除不需要的自动配置类。
5. 部署验证
完成以上配置后,重新打包部署到外部Tomcat:
- 访问你的API路径,比如
http://你的域名/app/你的接口路径,应该能正常返回结果 - 验证其他Servlet的路径(如
/dwr/*、/services/*)也能正常工作
内容的提问来源于stack exchange,提问作者Amit Jadhav

