Spring Boot中Thymeleaf无法识别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>
解决方案
检查控制器包扫描范围
@SpringBootApplication默认扫描当前类所在包及其子包。如果UserAccountController不在ChatSbAppApplication的同级或子包下,需在主类添加@ComponentScan指定扫描路径:@SpringBootApplication @ComponentScan(basePackages = {"com.yourpackage.controller", "com.yourpackage"}) public class ChatSbAppApplication { // ... }移除自定义WebConfig
Spring Boot已自动配置Thymeleaf,自定义的ViewResolver、TemplateEngine可能覆盖默认配置导致映射失效,直接删除WebConfig类即可。开启Web日志排查映射
在application.properties中添加日志配置,查看控制器映射是否被正确注册:logging.level.org.springframework.web=DEBUG启动应用后,搜索日志中
Mapped "{[/login],methods=[GET]}"这类字样,确认映射是否存在。修正表单提交注解
注册接口的@RequestBody适用于JSON请求,若为表单提交需改为@ModelAttribute:@PostMapping("/register") public String registerUser(@ModelAttribute UserAccount userAccount) { userAccountService.saveUserAccount(userAccount); return "redirect:/login"; }修正HTML跳转链接
error.html中的跳转链接需使用Thymeleaf语法,避免直接访问静态文件:<button class="auth-button" onclick="window.location.href='[[@{/login}]]'">Login</button>
内容的提问来源于stack exchange,提问作者Baromir19

