java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot集成thymeleaf 404

SpringBoot集成thymeleaf浏览器404的解决方案

作者:十连满潜

前后端不分离的古早 SpringMVC 项目通常会使用 thymeleaf 模板引擎来完成 html 页面与后端接口之间的交互,如果要将项目架构升级成 SpringBoot , thymeleaf 也可以照常集成,但有时候会踩到一些坑,所以本文给大家介绍了SpringBoot集成thymeleaf浏览器404的解决方案

引言

前后端不分离的古早 SpringMVC 项目通常会使用 thymeleaf 模板引擎来完成 html 页面与后端接口之间的交互。如果要将项目架构升级成 SpringBoot , thymeleaf 也可以照常集成。但有时候会踩到一些坑,特别是如今有了一些 AI 工具,而工具偶尔会抽风时……

相关依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.7.18</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
        <version>2.1.8.RELEASE</version>
    </dependency>
</dependencies>

如果整体项目架构采用的是 SpringCloud ,那么版本号完全可以写在父项目的 pom,或具体的版本管理子项目中,其他的子服务在引入依赖时便无需额外再写一行 version。

按网上大多数的教程,引入依赖时均没有指定版本,我一开始也没指定,项目也没报错,但是启动后又一直无法访问到预计的 html 文件。兜兜转转发现 thymeleaf 居然没引入成功……

这还有个小插曲,我问通义灵码 SpringBoot 2.7.18 对应的 thymeleaf 集成的版本是多少?它给我报了 3.1.8,喜闻乐见找不到,后来在阿里云云效 maven 找了可用版本,才确认了这个 2.7.18.RELEASE 可用。

怎么判断thymeleaf是否成功集成了? 找到thymeleafProperties.class,在里面的 setPrefix 方法打个断点,看看能不能进去,能进去就说明正常了。

文件结构

一个最简单的 SpringBoot 项目,要求启动后访问目标端口时能访问到自定义首页,先不管首页内容是什么、长什么样,新建一个 html 总是没错的。但新建在哪里呢?

哪里都可以。

考虑到 SpringBoot 项目打包后都是一个完整的 jar 包,这意味着如果不做干预的话,前端文件到时候也会被打包在 jar 中,修改起来就相当麻烦。好在它可以被配置,因此可以做到相当程度的 “伪” 前后端分离。

配置写在 resources 下 application.yaml 文件的 spring.thymeleaf.prefix 里。

这里如果不修改的话,它默认对应的是 classpath:/templates/

spring:
  thymeleaf:
    prefix: file:xxxx/my-cloud2/ui/templates/
    suffix: .html
    cache: false
    mode: HTML
    encoding: UTF-8

踩坑之路

一开始没引入成功时,项目启动是完全正常的,控制台也没有报错,只有浏览器一直在 404 。

不得已,多配置了几行日志处理的参数。

logging:
  level:
    org:
      springframework:
        web:
          servlet:
            DispatcherServlet: DEBUG
        thymeleaf: DEBUG

才在控制台看到 404 真正对应的内容。

虽然看起来也没什么用。

我一开始的 controller 相当简单,通过 /user 进入 index 视图:

@RequestMapping("user")
@Controller
public class UserController {

    @GetMapping("/")
    public String init(){
        return "index";
    }
}

404 后我又把 return 的字符串改成/index index.html /templates/index,但全部无效,心灰意冷地把 /templates/index 发给 AI,它说这种写法通常是WEB-INF路径下的文件,于是灵机一动,才终于发现是我的thymeleaf从头到尾没引入成功(pom里面的引入配置无法用 ctrl +鼠标左键跳转进入,而我之前看它没红就没管了……)

但实际上,即使我在 resources 文件夹下新建一个 WEB-INF 再把我的 index.html 拷贝进去,它也还是 404 。这个没太搞明白,鉴于也不是我的目标,就没管了,大概率配置上的问题两相干扰,结果谁都指望不上。加了 spring-boot-starter-thymeleaf 的版本号后才正常些。

踩坑支线

通常在配置修改无效的时候,第一个怀疑的是浏览器或 IDEA 的缓存,浏览器用 ctrl + F5,有时候得进配置里搜索 “缓存” 后手动清除(我的 Chrome 有时候得这样),IDEA的缓存就 File->Invalidate Caches / Restart ,再不行就 mvn clean 。

其实还有个地方,即便原先配置没错,只是重新选择一下,有时候都挺能解决问题的(原理可能也是缓存?)

它就是:File->Project Settings->Modules->各个项目->Dependencies->Module SDK

打扫干净后,再启动就正常了。

到此这篇关于SpringBoot集成thymeleaf浏览器404的解决方案的文章就介绍到这了,更多相关SpringBoot集成thymeleaf 404内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文