自学内容网 自学内容网

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

在这里插入图片描述

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


原文地址:https://blog.csdn.net/qq_41035145/article/details/144411499

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!