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

Tomcat中Dispatcher Servlet无法加载问题求助(附Maven项目配置)

解决DispatcherServlet无法加载的问题

我注意到你的代码里有几个关键问题导致DispatcherServlet加载失败,咱们一步步来排查和修复:

1. onStartup方法的冲突问题

你重写了onStartup方法但注释掉了super.onStartup(servletContext),同时手动初始化了DispatcherServlet。但AbstractAnnotationConfigDispatcherServletInitializer的父类方法已经帮你完成了DispatcherServlet的注册和初始化逻辑,你手动写的代码和父类逻辑冲突了,反而会导致配置失效。

修复方案:

要么完全移除自定义的onStartup实现,让父类的逻辑自动处理:

public class ADInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        // 根上下文配置(比如Service、DAO层的配置),如果没有可以返回null
        return new Class[] { RootConfig.class }; 
    }
    
    @Override
    protected Class<?>[] getServletConfigClasses() {
        // 这里应该传入WebMvc的配置类,也就是你的ADConfiguration
        return new Class[] { ADConfiguration.class };
    }
    
    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
    
    @Override
    protected Filter[] getServletFilters() {
        return null;
    }

    // 移除自定义的onStartup方法,让父类处理初始化
}

如果确实需要自定义onStartup,一定要先调用父类方法:

@Override
public void onStartup(ServletContext servletContext) throws ServletException {
    super.onStartup(servletContext); // 必须先调用父类初始化逻辑
    // 在这里添加你的自定义逻辑,比如注册额外的Filter、Listener等
}

2. 配置类的归属问题

你把ADConfiguration放到了getRootConfigClasses里,但ADConfiguration是WebMvcConfigurerAdapter的子类,属于DispatcherServlet的子上下文配置,应该放到getServletConfigClasses中。根上下文(getRootConfigClasses)一般用来放业务层、持久层的配置,和Web层无关。

3. 其他验证点

  • 确认Maven依赖:确保spring-webmvc依赖已经正确引入,版本和你的Spring其他组件一致
  • 检查Tomcat部署:确认项目已正确部署到Tomcat,没有报错日志(可以查看Tomcat的logs/catalina.out或者IDE的控制台日志)
  • 视图路径验证:确保/views/目录存在于项目的webapp下,JSP文件路径正确

修改后的ADConfiguration可以保持不变,不过建议换成WebMvcConfigurer接口(WebMvcConfigurerAdapter在Spring 5.0后已被废弃):

public class ADConfiguration implements WebMvcConfigurer {
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/views/");
        viewResolver.setSuffix(".jsp");
        registry.viewResolver(viewResolver);
    }
    
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
    }
}

按照上面的修改后,重新部署项目,DispatcherServlet应该能正常加载了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:56:55