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

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支持友好,无需手动配置视图解析器:

  1. 在pom.xml中添加Thymeleaf依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
  1. 将HTML文件从resources/static/移动到resources/templates/目录
  2. 控制器代码无需修改,直接返回视图名即可自动解析:
@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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:57:48