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

迁移至Spring Boot 1.5.4后,移除显式Dispatcher Servlet遇404问题求助

解决Spring Boot移除自定义DispatcherServlet后外部Tomcat访问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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 14:07:48