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

Spring Boot中Thymeleaf无法识别templates目录下HTML页面求助

Spring Boot 3.1.1 无法访问templates下HTML页面问题

问题背景

基于Eclipse IDE、Spring Boot 3.1.1和Maven开发项目,src/main/resources/templates目录下的error.html可通过/error路径正常访问,但login.html、register.html等页面,通过控制器定义的localhost:8080/login这类映射访问时失败。日志无错误或警告信息,也未显示控制器映射的注册记录,已引入Thymeleaf依赖,尝试过更新Maven项目、自定义WebConfig配置仍未解决问题。

相关代码

主启动类

@SpringBootApplication
public class ChatSbAppApplication {

    public static void main(String[] args) {
        SpringApplication.run(ChatSbAppApplication.class, args);
    }

}

正常工作的错误控制器

@Controller
public class ErrorController implements org.springframework.boot.web.servlet.error.ErrorController {

    @RequestMapping("/error")
    public String handleError() {
        return "error";
    }

    @Override
    public String getErrorPath() {
        return "/error";
    }
}

用户账户控制器(映射失效)

@Controller
public class UserAccountController {

    private final UserAccountService userAccountService;

    @Autowired
    public UserAccountController(UserAccountService userAccountService) {
        this.userAccountService = userAccountService;
    }
    
    // 注册相关
    @GetMapping("/register")
    public String showRegistrationForm() {
        return "register";
    }

    @PostMapping("/register")
    public String registerUser(@RequestBody UserAccount userAccount) {
        userAccountService.saveUserAccount(userAccount);
        return "redirect:/login";
    }
    
    // 登录相关
    @GetMapping("/login")
    public String loginUser() {
        return "login";
    }

    @PostMapping("/login")
    public String processLoginForm() {
        return "redirect:/chats";
    }
}

application.properties配置

spring.datasource.url=jdbc:postgresql://localhost:5432/ChatDB
spring.datasource.username=postgres
spring.datasource.password=1234
spring.datasource.driver-class-name=org.postgresql.Driver
server.error.whitelabel.enabled = false
spring.jpa.open-in-view=false

尝试过的自定义WebConfig

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Bean
    public ViewResolver viewResolver() {
        ThymeleafViewResolver resolver = new ThymeleafViewResolver();
        resolver.setTemplateEngine(templateEngine());
        resolver.setCharacterEncoding("UTF-8");
        return resolver;
    }

    @Bean
    public TemplateEngine templateEngine() {
        SpringTemplateEngine engine = new SpringTemplateEngine();
        engine.setEnableSpringELCompiler(true);
        engine.setTemplateResolver(templateResolver());
        return engine;
    }

    @Bean
    public ITemplateResolver templateResolver() {
        SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
        resolver.setPrefix("classpath:/templates/");
        resolver.setSuffix(".html");
        resolver.setTemplateMode(TemplateMode.HTML);
        resolver.setCharacterEncoding("UTF-8");
        return resolver;
    }
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoggingInterceptor());
    }
}

HTML示例(error.html)

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
  <title>Error Page</title>
  <link rel="stylesheet" type="text/css" th:href="@{index.css}">
</head>
<body>
  <div class="navbar">
    <div class="navbar-logo">
        <button onclick="changeColor()" class="color-button">
        </button>
    </div>
    <div style="display:flex; margin-right: 40px;">
      <button class="auth-button" onclick="window.location.href='login.html'">Login</button>
    </div>
  </div>
  <script src="index.js"></script>
</body>
</html>

解决方案

  1. 检查控制器包扫描范围
    @SpringBootApplication默认扫描当前类所在包及其子包。如果UserAccountController不在ChatSbAppApplication的同级或子包下,需在主类添加@ComponentScan指定扫描路径:

    @SpringBootApplication
    @ComponentScan(basePackages = {"com.yourpackage.controller", "com.yourpackage"})
    public class ChatSbAppApplication {
        // ...
    }
    
  2. 移除自定义WebConfig
    Spring Boot已自动配置Thymeleaf,自定义的ViewResolver、TemplateEngine可能覆盖默认配置导致映射失效,直接删除WebConfig类即可。

  3. 开启Web日志排查映射
    在application.properties中添加日志配置,查看控制器映射是否被正确注册:

    logging.level.org.springframework.web=DEBUG
    

    启动应用后,搜索日志中Mapped "{[/login],methods=[GET]}"这类字样,确认映射是否存在。

  4. 修正表单提交注解
    注册接口的@RequestBody适用于JSON请求,若为表单提交需改为@ModelAttribute:

    @PostMapping("/register")
    public String registerUser(@ModelAttribute UserAccount userAccount) {
        userAccountService.saveUserAccount(userAccount);
        return "redirect:/login";
    }
    
  5. 修正HTML跳转链接
    error.html中的跳转链接需使用Thymeleaf语法,避免直接访问静态文件:

    <button class="auth-button" onclick="window.location.href='[[@{/login}]]'">Login</button>
    

内容的提问来源于stack exchange,提问作者Baromir19

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:57:23