Spring Boot中@Controller无法映射静态HTML资源的问题求助
Spring Boot 3.1.5 @Controller无法映射静态HTML资源的解决方案
问题诊断
从日志可见,当前配置的InternalResourceViewResolver尝试转发到/resources/**/login.html,但该路径不存在——你将HTML放在resources/static/下,Spring Boot默认会把该目录映射到根路径(即/login.html可直接访问),而InternalResourceViewResolver仅适配Servlet容器上下文内的资源(如webapps目录下的文件),无法正确解析classpath下的静态资源。
解决方案
方案1:使用重定向(快速解决)
修改控制器方法,直接重定向到静态资源路径:
@Controller public class AssignmentController { @GetMapping("home") public String home() { return "redirect:/home.html"; } @GetMapping("/") public String main() { return "redirect:/index.html"; } @GetMapping("login") public String myLogin() { return "redirect:/login.html"; } }
方案2:配置正确的视图解析器
替换原有的InternalResourceViewResolver为ResourceViewResolver,用于解析classpath下的静态资源:
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void configureViewResolvers(ViewResolverRegistry registry) { ResourceViewResolver viewResolver = new ResourceViewResolver(); // 指定静态资源所在的classpath路径 viewResolver.setPrefix("classpath:/static/"); viewResolver.setSuffix(".html"); registry.viewResolver(viewResolver); } }
同时删除以下错误配置:
application.properties中的spring.mvc.view.prefix等相关配置- 原自定义WebMvcConfigurer中的
InternalResourceViewResolver配置
修改后,控制器返回home即可映射到classpath:/static/home.html。
方案3:改用Thymeleaf(推荐)
Spring Boot推荐用模板引擎管理视图,Thymeleaf对HTML支持友好,无需手动配置视图解析器:
- 在
pom.xml中添加Thymeleaf依赖:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>
- 将HTML文件从
resources/static/移动到resources/templates/目录 - 控制器代码无需修改,直接返回视图名即可自动解析:
@Controller public class AssignmentController { @GetMapping("home") public String home() { return "home"; // 对应templates/home.html } @GetMapping("/") public String main() { return "index"; // 对应templates/index.html } @GetMapping("login") public String myLogin() { return "login"; // 对应templates/login.html } }
关键注意点
- Spring Boot默认静态资源路径:
classpath:/static/、classpath:/public/、classpath:/resources/、classpath:/META-INF/resources/,这些目录下的文件可直接通过根路径访问 InternalResourceViewResolver仅适用于Servlet容器的物理路径(如webapps/WEB-INF),不适用于classpath下的静态资源
内容的提问来源于stack exchange,提问作者Abrar
相关产品推荐
相关产品推荐

