无Spring Boot的Spring配置:/main/hello端点404问题排查
非Spring Boot环境下Spring MVC配置404问题排查
问题描述
尝试在不使用Spring Boot的情况下配置Spring,已添加Tomcat依赖、创建MainController类并配置Dispatcher Servlet,但访问端点http://localhost:8080/main/hello时出现404错误,怀疑问题出在ServletDispatcherConfig中。
相关代码
ServletDispatcherConfig类
@Component public class ServletDispatcherConfig extends AbstractAnnotationConfigDispatcherServletInitializer { @Override protected Class<?>[] getRootConfigClasses() { return null; } @Override protected Class<?>[] getServletConfigClasses() { return new Class[] {SpringConfig.class}; } @Override protected String[] getServletMappings() { return new String[] {"/"}; } }
SpringConfig类
@Configuration @ComponentScan("example.test") @EnableWebMvc public class SpringConfig { private final ApplicationContext applicationContext; @Autowired public SpringConfig(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } @Bean public SpringResourceTemplateResolver templateResolver() { var resolver = new SpringResourceTemplateResolver(); resolver.setCacheable(true); resolver.setPrefix("/WEB-INF/templates/"); resolver.setSuffix(".html"); resolver.setApplicationContext(applicationContext); resolver.setTemplateMode(TemplateMode.HTML); return resolver; } @Bean public SpringTemplateEngine templateEngine() { var engine = new SpringTemplateEngine(); engine.setTemplateResolver(templateResolver()); engine.setEnableSpringELCompiler(true); // delete if any bugs will be return engine; } @Bean public ThymeleafViewResolver viewResolver() { var templateResolver = new ThymeleafViewResolver(); templateResolver.setTemplateEngine(templateEngine()); return templateResolver; } }
MainController类
@Controller @RequestMapping("/main") public class MainController { @GetMapping("/first") public String main() { return "/main"; } @GetMapping("/hello") public String hello() { return "/main"; } }
问题排查及解决建议
- 移除ServletDispatcherConfig上的@Component注解:
AbstractAnnotationConfigDispatcherServletInitializer是Servlet容器用来初始化Spring MVC的入口类,不需要被Spring组件扫描,加@Component会导致不必要的加载冲突,直接删除该注解即可。 - 检查视图文件路径:Controller返回的
"/main"会被Thymeleaf解析为/WEB-INF/templates/main.html,请确认该文件存在且路径正确。如果视图文件在/WEB-INF/templates/main/main.html,则返回值应改为"main/main"(去掉开头的斜杠,避免路径重复)。 - 验证组件扫描范围:确认MainController所在的包是否包含在
example.test下,@ComponentScan需要覆盖到Controller所在包,否则Spring无法识别并加载该Controller。 - 检查Tomcat部署上下文:确认项目部署到Tomcat后的上下文路径是否为根路径。如果上下文路径不是根,访问地址需要加上项目名,例如
http://localhost:8080/your-project-name/main/hello。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

