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
相关产品推荐
相关产品推荐

