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

 更新时间:2024年12月12日 10:32:49   作者:十连满潜  
前后端不分离的古早 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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java正则表达式的替换和分组功能

    Java正则表达式的替换和分组功能

    这篇文章主要给大家介绍了关于Java正则表达式的替换和分组功能的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 如何用Java实现.env文件读取敏感数据

    如何用Java实现.env文件读取敏感数据

    这篇文章主要介绍了如何用Java实现.env文件读取敏感数据,并提供了一个自动配置类EnvAutoConfiguration,common-env-starter-demo模块展示了如何配置和启动一个简单的Spring Boot应用程序,需要的朋友可以参考下
    2025-02-02
  • java调用外部程序的方法及代码演示

    java调用外部程序的方法及代码演示

    这篇文章主要介绍了java调用外部程序的方法及代码演示的相关资料,需要的朋友可以参考下
    2023-03-03
  • 关于Java企业级项目开发思想

    关于Java企业级项目开发思想

    Java企业级项目开发思想。偶遇,读有所得,遂分享给大家,本文不涉及案例,只谈思想和理念,需要的朋友可以参考。
    2017-09-09
  • SpringMVC设置全局异常处理器的步骤

    SpringMVC设置全局异常处理器的步骤

    在项目中我们有需求做一个全局异常处理,来规范所有出去的异常信息,这篇文章主要介绍了SpringMVC设置全局异常处理器,需要的朋友可以参考下
    2024-03-03
  • Java比较集合是否相等的技巧分享

    Java比较集合是否相等的技巧分享

    集合使我们开发过程中非常用到的,要说最常用的,非List莫属,那么当我们想要比较两个List是否相等的时候,应该怎么处理呢?本文将介绍几个小技巧来处理,需要的朋友可以参考下
    2025-06-06
  • springboot应用访问zookeeper的流程

    springboot应用访问zookeeper的流程

    这篇文章主要介绍了springboot应用访问zookeeper的流程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Scheduled如何会在上次任务执行完才会执行下次任务

    Scheduled如何会在上次任务执行完才会执行下次任务

    这篇文章主要介绍了Scheduled如何会在上次任务执行完才会执行下次任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java实现WGS84/GCJ02/BD09的坐标互转终极方案

    Java实现WGS84/GCJ02/BD09的坐标互转终极方案

    这篇文章主要为大家详细介绍了Java如何利用Geotools实现WGS84/GCJ02/BD09的坐标互转,文中的示例代码讲解详细,需要的小伙伴可以了解下
    2025-09-09
  • Java 创建线程的两个方法详解及实例

    Java 创建线程的两个方法详解及实例

    这篇文章主要介绍了Java 创建线程的两个方法详解及实例的相关资料,需要的朋友可以参考下
    2017-03-03

最新评论