Spring MVC无法正常运行:路由404与视图解析500报错求助
嘿,刚接触Spring MVC和Thymeleaf遇到这种问题太正常了,我来帮你捋捋清楚!
先搞懂核心问题:@EnableWebMVC为啥会把404变成500?
Spring Boot默认已经帮我们配置好了Web MVC的整套规则——包括静态资源访问路径、Thymeleaf视图解析器这些。而手动添加@EnableWebMVC会直接覆盖这些默认配置,相当于把Spring Boot帮你搭好的架子拆了,这就是你加注解后出现500(找不到index视图)的核心原因。
下面分两种场景给你解决方法:
场景1:移除@EnableWebMVC,用Spring Boot默认配置解决404
这是新手最推荐的方式,先回到初始状态排查问题:
- 检查主启动类:确保它标注了
@SpringBootApplication(这个注解已经包含了组件扫描,能自动找到你的控制器) - 检查控制器注解:别把
@Controller写成@RestController!前者是用来返回视图页面的,后者会直接把返回值当成JSON/字符串返回,根本不会走视图解析器,这是新手最容易踩的坑。正确的控制器写法应该是这样:@Controller public class HomeController { @GetMapping("/") public String home() { // 返回视图名"index",Thymeleaf会自动去templates下找index.html return "index"; } } - 静态资源直接访问测试:
/src/main/resources/static下的文件可以直接通过URL访问,比如你直接输入http://localhost:8080/index.html,如果还404,那可能是IDE没正确编译资源,试试清理项目后重新构建。
场景2:如果一定要用@EnableWebMVC,手动配置视图解析器
如果你因为某些特殊需求必须加@EnableWebMVC,那得手动把Spring Boot默认帮你配置的内容补回来:
创建一个Web配置类,手动配置Thymeleaf视图解析器和静态资源路径:
@Configuration @EnableWebMvc public class WebConfig implements WebMvcConfigurer { @Autowired private ApplicationContext applicationContext; // 配置Thymeleaf模板解析器,指定模板文件位置和后缀 @Bean public SpringResourceTemplateResolver templateResolver() { SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); templateResolver.setApplicationContext(applicationContext); templateResolver.setPrefix("classpath:/templates/"); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode(TemplateMode.HTML); templateResolver.setCharacterEncoding("UTF-8"); return templateResolver; } @Bean public SpringTemplateEngine templateEngine() { SpringTemplateEngine templateEngine = new SpringTemplateEngine(); templateEngine.setTemplateResolver(templateResolver()); templateEngine.setEnableSpringELCompiler(true); return templateEngine; } // 注册Thymeleaf视图解析器 @Override public void configureViewResolvers(ViewResolverRegistry registry) { ThymeleafViewResolver resolver = new ThymeleafViewResolver(); resolver.setTemplateEngine(templateEngine()); resolver.setCharacterEncoding("UTF-8"); registry.viewResolver(resolver); } // 配置静态资源访问路径,不然static下的文件也访问不到 @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/static/"); } }
最后确认依赖是否正确
检查你的pom.xml(Maven)或build.gradle(Gradle)里有没有Thymeleaf的starter依赖:
- Maven:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> - Gradle:
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
如果没加这个依赖,Spring Boot根本不会自动配置Thymeleaf视图解析器,就算你把文件放在templates下也找不到。
内容的提问来源于stack exchange,提问作者Vicente Rivera
相关产品推荐
相关产品推荐

