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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用IDEA直接连接MySQL数据库的方法

    使用IDEA直接连接MySQL数据库的方法

    这篇文章主要介绍了如何使用IDEA直接连接MySQL数据库,首先需要新建一个空项目,第一次连接 需要先下载驱动,文中给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-04-04
  • Java集合框架迭代器Iterator实现原理解析

    Java集合框架迭代器Iterator实现原理解析

    这篇文章主要介绍了Java集合框架迭代器Iterator实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 深入分析RabbitMQ中死信队列与死信交换机

    深入分析RabbitMQ中死信队列与死信交换机

    这篇文章主要介绍了RabbitMQ中死信队列与死信交换机,死信队列就是一个普通的交换机,有些队列的消息成为死信后,一般情况下会被RabbitMQ清理,感兴趣想要详细了解可以参考下文
    2023-05-05
  • SpringBoot学习之Json数据交互的方法

    SpringBoot学习之Json数据交互的方法

    这篇文章主要介绍了SpringBoot学习之Json数据交互的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • 使用redisTemplate从redis获取所有数据

    使用redisTemplate从redis获取所有数据

    这篇文章主要介绍了使用redisTemplate从redis获取所有数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • 使用spring容器在初始化Bean时前和后的操作

    使用spring容器在初始化Bean时前和后的操作

    这篇文章主要介绍了使用spring容器在初始化Bean时前和后的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • SpringBoot项目导入外部jar包的详细指南

    SpringBoot项目导入外部jar包的详细指南

    在开发SpringBoot项目时,我们经常需要引入一些外部的jar包来增强项目的功能,这些jar包可能不是Maven中央仓库中的,或者我们想要使用特定版本的jar包,本文将详细介绍如何在SpringBoot项目中导入外部jar包,需要的朋友可以参考下
    2024-10-10
  • 手写redis@Cacheable注解 支持过期时间设置方式

    手写redis@Cacheable注解 支持过期时间设置方式

    这篇文章主要介绍了手写redis@Cacheable注解 支持过期时间设置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Lucene单值编码压缩算法源码解析

    Lucene单值编码压缩算法源码解析

    这篇文章主要为大家介绍了Lucene单值编码压缩算法源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Java如何实现压缩文件与解压缩zip文件

    Java如何实现压缩文件与解压缩zip文件

    这篇文章主要介绍了Java如何实现压缩文件与解压缩zip文件问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-12-12

最新评论