SpringBoot3.x.x整合Ehcache3 实例(入门踩坑教程)

news2024/11/20 10:41:48

近期尝试了一下
SpringBoot 3.3.5
JDK17
Ehcache3.10.8整合
注意,这个版本的boot,提出了公用的缓存模板,Spring官网有相关介绍,整合ehcache需要使用jcache。
老版本的3.0版本以下整合,我这里就不参与了,可以百度自行了解。

废话不多说,直接上Code

Pom文件,(第一坑,Ehcahce3报出xml解析不了,高版本的jdk会出现的jakarta问题
Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/ValidationEventHandler
百度可以找到版本问题,但是找不到核心问题。所以没办法只能去啃ehcache3官网:https://www.ehcache.org/documentation/3.10/ ++》https://github.com/ehcache/ehcache3/releases/tag/v3.10.8
去看看Ehcache3的依赖配置:关于如何整入JR107(JCache)
提示到:高版本的jdk需要使用jakarta命名空间做区分,而低版本的则是使用javax.
在这里插入图片描述

PS:springboot3源码其实也给了提示:
在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.3.5</version>
    </parent>
    <groupId>com.tonyjoba</groupId>
    <artifactId>SpringBoot_SSM</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBoot3_Ehcache3</name>
    <description>整合框架SpringBoot3_Ehcache3</description>
    <properties>
        <java.version>17</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>
    <dependencies>
        <!--开启Spring Boot 缓存场景启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <!-- springBoot 的启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        .......中间的省略,可以根据自己的项目配置
        <!-- Ehcache 坐标 -->
        <dependency>
            <groupId>org.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>3.10.8</version>
            <!--注意如果是用高版本的jdk,需要添加这个,否则会解析不了xml配置文件,类解析器-->
            <classifier>jakarta</classifier>
        </dependency>
       <!--测试场景启动器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

全局配置:application.yml

spring:
  cache: #配置SpringBoot的缓存,通过统一的缓存模板jcache
    type: jcache #jcache 支持 ehcache3 redis等
    jcache:
      #jcache提供方
      provider: org.ehcache.jsr107.EhcacheCachingProvider
      config: classpath:ehcache3.xml #配置ehcache的配置文件

自定义的类

package com.tonyjoba.pojo;

import jakarta.persistence.*;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;

import java.io.Serializable;

@Entity
@Table(name = "users")
public class Users implements Serializable {
    public static final long serialVersionUID = 1213312L;
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id")
    private Integer id;//注意这里是Integer,即将第二个坑
    @NotBlank(message = "用户名不可为空")
    @Column(name = "name")
    private String name;
    @Min(value = 0,message = "年龄不能为负数")
    @NotNull(message = "年龄不可为空")
    @Column(name = "age")
    private Integer age;

    @Column(name = "address")
    private String address;


    public Users() {
    }

    public Users(Integer id, String name, Integer age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Max(value = 150,message = "年龄不能大于150")
    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Users{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", address='" + address + '\'' +
                '}';
    }
}

业务代码 这里的key是用的Integer,继续看ehcache3.xml中的配置,出现了问题。

	@Cacheable(value="users", key = "#id")
    //@Cacheable:对当前查询的对象做缓存处理
    @Override
    public Users findUserById(Integer id) {
        //return this.usersMapper.selectUsersById(id);
        return this.usersRepository.findById(id).get();
    }

ehcache3.xml (第二坑,key类型不匹配问题报错Persisted key type …is not the same as the configured key type …),可以很容一发现,改成一致的Integer就可以了,但是,改成了一致之后,重启boot,会发现还报错。这里是因为第一次启动后,在C:/Users/hahah/Desktop/cache目录下已经生成了一部分的缓存文件,导致一六文件中依旧有不匹配的信息,所以,这里把文件删了就可以了。真的HLS!!!!
在这里插入图片描述

<config xmlns='http://www.ehcache.org/v3'>
    <!-- 持久化 路径 -->
    <persistence directory="C:/Users/hahah/Desktop/cache"/>

    <!-- 缓存模版,此处为了显示其用法,也可以不用模版直接在cache中配置与模版参数相同 -->
    <cache-template name="oneHourTemplate">
        <!--        <key-type>java.lang.String</key-type>-->
        <!--        <value-type>java.lang.String</value-type>-->
        <expiry>
            <!-- 单位默认为秒当用秒作单位时,可以不填-->
            <ttl unit="hours">1</ttl>
        </expiry>
        <resources>
            <!-- 单位默认为entries当用entries作单位时,可以不填-->
            <heap>100</heap>
            <offheap unit="MB">5</offheap>
            <!-- persistent 默认为false可以不填-->
            <disk unit="MB">1024</disk>
        </resources>
    </cache-template>

   

    <!-- 缓存对象,如果使用了模版会覆盖模版中的内容,使用uses-template=""来引用模版 -->
    <cache alias="mycache" uses-template="oneHourTemplate">
    </cache>

    <cache alias="users">
    	 <!-- 第二坑,注意这里的key是Long,而不是我们指定的key类型Integer,所以需要修改成Integer-->
        <key-type>java.lang.Long</key-type>
        <value-type>com.tonyjoba.pojo.Users</value-type>
        <expiry>
            <tti unit="seconds">10</tti>
        </expiry>
        <resources>
            <heap unit="MB">10</heap>
            <offheap unit="MB">50</offheap>
            <disk persistent="true" unit="MB">500</disk>
        </resources>
    </cache>

</config>

Caused by: java.lang.IllegalArgumentException: Persisted key type 'java.lang.Integer' is not the same as the configured key type 'java.lang.Long'
	at org.ehcache.impl.internal.store.disk.OffHeapDiskStore.recoverBackingMap(OffHeapDiskStore.java:184) ~[ehcache-3.10.8-jakarta.jar:3.10.8]
	at org.ehcache.impl.internal.store.disk.OffHeapDiskStore.getBackingMap(OffHeapDiskStore.java:159) ~[ehcache-3.10.8-jakarta.jar:3.10.8]
	at org.ehcache.impl.internal.store.disk.OffHeapDiskStore.access$600(OffHeapDiskStore.java:90) ~[ehcache-3.10.8-jakarta.jar:3.10.8]
	at org.ehcache.impl.internal.store.disk.OffHeapDiskStore$Provider.init(OffHeapDiskStore.java:441) ~[ehcache-3.10.8-jakarta.jar:3.10.8]
	at org.ehcache.impl.internal.store.disk.OffHeapDiskStore$Provider.initStore(OffHeapDiskStore.java:437) ~[ehcache-3.10.8-jakarta.jar:3.10.8]
	at org.ehcache.impl.internal.store.disk.OffHeapDiskStore$Provider.initAuthoritativeTier(OffHeapDiskStore.java:483) ~[ehcache-3.10.8-jakarta.jar:3.10.8]
	at org.ehcache.impl.internal.store.tiering.TieredStore$Provider.initStore(TieredStore.java:549) ~[ehcache-3.10.8-jakarta.jar:3.10.8]
	at org.ehcache.core.EhcacheManager$7.init(EhcacheManager.java:514) ~[ehcache-3.10.8-jakarta.jar:3.10.8]
	at org.ehcache.core.StatusTransitioner.runInitHooks(StatusTransitioner.java:130) ~[ehcache-3.10.8-jakarta.jar:3.10.8]
	at org.ehcache.core.StatusTransitioner.access$000(StatusTransitioner.java:33) ~[ehcache-3.10.8-jakarta.jar:3.10.8]
	at org.ehcache.core.StatusTransitioner$Transition.succeeded(StatusTransitioner.java:189) ~[ehcache-3.10.8-jakarta.jar:3.10.8]
	...

Boot启动配置,添加 @EnableCaching

package com.tonyjoba;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@MapperScan("com.tonyjoba.mapper")
@EnableCaching
public class SpringBootApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootSsmApplication.class, args);
    }

}

一切修正了之后,重启,搞掂!!!看到logo真嗨森

 D:\WorkSoftInstallSpace\java17\jdk-17.0.12\bin\java.exe -agentlib...
 Connected to the target VM, address: '127.0.0.1:60252', transport: 'socket'
 _________  ________  ________       ___    ___         ___  ________  ________  ________     
|\___   ___\\   __  \|\   ___  \    |\  \  /  /|       |\  \|\   __  \|\   __  \|\   __  \    
\|___ \  \_\ \  \|\  \ \  \\ \  \   \ \  \/  / /       \ \  \ \  \|\  \ \  \|\ /\ \  \|\  \   
     \ \  \ \ \  \\\  \ \  \\ \  \   \ \    / /      __ \ \  \ \  \\\  \ \   __  \ \   __  \  
      \ \  \ \ \  \\\  \ \  \\ \  \   \/  /  /      |\  \\_\  \ \  \\\  \ \  \|\  \ \  \ \  \ 
       \ \__\ \ \_______\ \__\\ \__\__/  / /        \ \________\ \_______\ \_______\ \__\ \__\
        \|__|  \|_______|\|__| \|__|\___/ /          \|________|\|_______|\|_______|\|__|\|__|
                                   \|___|/                                                    

2024-11-19T02:47:15.814+08:00  INFO 19216 --- [           main] com.tonyjoba.SpringBootSsmApplication    : Starting SpringBootSsmApplication using Java 17.0.12 with PID 19216 
2024-11-19T02:47:21.768+08:00  INFO 19216 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port 8080 (http) with context path '/'
2024-11-19T02:47:21.780+08:00  INFO 19216 --- [           main] com.tonyjoba.SpringBootSsmApplication    : Started SpringBootSsmApplication in 6.565 seconds (process running for 7.485)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2243990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨平台WPF框架Avalonia教程 十六

SelectableTextBlock 可选文本块 SelectableTextBlock 块是一个用于显示文本的标签&#xff0c;允许选择和复制文本。它可以显示多行&#xff0c;并且可以完全控制所使用的字体。 有用的属性​ 您可能最常使用这些属性&#xff1a; 属性描述SelectionStart当前选择的起始字…

每日一练:【优先算法】双指针之移动零(easy)

双指针概念介绍 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff0c;一种是左右指针。 对撞指针&#xff1a;一般用于顺序结构中&#xff0c;也称左右指针。 • 对撞指针从两端向中间移动。一个指针从最左端开始&#xff0c;另一个从最右端开始&#xff0c;然后逐渐…

ASP.NET Core Webapi 返回数据的三种方式

ASP.NET Core为Web API控制器方法返回类型提供了如下几个选择&#xff1a; Specific type IActionResult ActionResult<T> 1. 返回指定类型&#xff08;Specific type&#xff09; 最简单的API会返回原生的或者复杂的数据类型&#xff08;比如&#xff0c;string 或者…

【JAVA】使用mybatis plus查询数据库中的geometry字段为null

目录 问题描述&#xff1a; 原码&#xff1a; 实体类&#xff1a; 接口&#xff1a; 解决方法&#xff1a; 1、创建Handle 2、配置handle让mybatis-plus能够识别 相关代码&#xff1a; 问题描述&#xff1a; 在 MyBatis Plus 中&#xff0c;查询的 geometry 字段在数据库…

51c自动驾驶~合集28

我自己的原文哦~ https://blog.51cto.com/whaosoft/12030824 #自动驾驶建图的统一矢量先验地图编码 高德地图&西交 | 先验驾驶 论文链接&#xff1a;https://arxiv.org/pdf/2409.05352 写在前面&笔者的个人理解 最近出现了很多先验地图的论文&#xff0c;高德地图…

【全面解读】Apache SeaTunnel常见问题全攻略

使用SeaTunnel需要安装Spark或者Flink这样的引擎么&#xff1f; 不需要&#xff0c;SeaTunnel 支持 Zeta、Spark 和 Flink 作为同步引擎的选择&#xff0c;您可以选择之一就行&#xff0c;社区尤其推荐使用 Zeta 这种专为同步场景打造的新一代超高性能同步引擎。Zeta 被社区用…

Spring Boot3.x自动配置不生效的排查与解决:IDEA 文件夹命名导致的问题

在使用Spring Boot搭建多模块项目时&#xff0c;需要使用到自动配置功能&#xff0c;把一些通用功能封装成模块后通过 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件注册配置类。然而&#xff0c;最近遇到一个奇怪的问题&#xff1a…

JavaSE(十四)——文件操作和IO

文章目录 文件操作和IO文件相关概念Java操作文件文件系统操作文件内容操作字节流FileOutputStreamFileInputStream代码演示 字符流FileWriterFileReader代码演示 缓冲流转换流 案例练习 文件操作和IO 文件相关概念 文件 通常指的是包含用户数据的文件&#xff0c;如文本文件、…

Qt桌面应用开发 第五天(常用控件)

目录 1.QPushButton和ToolButton 1.1QPushButton 1.2ToolButton 2.RadioButton和CheckBox 2.1RadioButton单选按钮 2.2CheckBox多选按钮 3.ListWidget 4.TreeWidget控件 5.TableWidget控件 6.Containers控件 6.1QScrollArea 6.2QToolBox 6.3QTabWidget 6.4QStacke…

Vue.js 插槽 Slots 实际应用 最近重构项目的时候遇到的...

前端开发中 插槽 Slots 是一个重要的概念 我们可以查看一下vue.js的官方文档 https://cn.vuejs.org/guide/components/slots 类似于连接通道一样 可以把核心代码逻辑搬到另外的地方 做一个引用 而原先的地方可能并不能这样书写 对于这个概念我在vue的官方文档里面找到了…

ubuntu pytorch容器内安装gpu版本的ffmpeg

一、基础镜像和生成容器 pytorch/pytorch &#xff1a;1.13.1-cuda11.6-cudnn8-devel 生成容器&#xff0c;一定要加NVIDIA_DRIVER_CAPABILITIEScompute,utility,video,graphics&#xff0c;否则侯建无法推流&#xff0c;报错缺少编码之类的。 docker run -it --gpus all -e …

VSCode+ESP-IDF开发ESP32-S3-DevKitC-1(2)第一个工程 LED心跳灯

VSCodeESP-IDF开发ESP32-S3-DevKitC-1&#xff08;2&#xff09;第一个工程 LED心跳灯 前言1.新建工程2.编写控制LED代码3.LED控制独立成.c和.h文件 前言 实际开发中很多时候我们需要有一个类似心跳灯或运行指示灯的灯以不同的状态闪烁以表示程序的运行状态&#xff0c;所以第…

在ubunto18.04安装node 14.16.0

这里演示安装node 14.16.0&#xff0c;其他版本也一样的安装步骤&#xff0c;需要注意1 1.检查本机服务器类型&#xff0c;有的是x64&#xff0c;有的是ARM&#xff0c;先查清楚是什么类型再进行下载&#xff0c;否则会存在编译出错的问题 bash: /opt/node-v14.16.0-linux-x6…

基于YOLOv8深度学习的智慧农业猪行为检测系统研究与实现(PyQt5界面+数据集+训练代码)

随着智慧农业的快速发展&#xff0c;畜牧业的智能化管理已逐渐成为提高生产效率、提升动物福利、降低运营成本的关键手段之一。在此背景下&#xff0c;畜牧场对动物行为的自动化监测需求日益增长&#xff0c;尤其是在大型养猪场&#xff0c;猪群的日常行为检测对于疾病预防、饲…

独立资源池与共享资源池在云计算中各自的优势

在云计算领域&#xff0c;独立资源池和共享资源池是两种关键的资源管理策略&#xff0c;它们各自具有独特的优势&#xff0c;以适应不同的业务需求和场景。 独立资源池的优势 资源独占性&#xff1a;独立资源池为特定应用或用户提供专属的资源&#xff0c;这意味着资源不会被其…

异或和之和

//暴力做法 枚举每个子区间 O(n^3) //优化1 利用前缀异或和快速求出区间异或和 O(n^2) //优化2 处理位运算的常用方法&#xff1a;拆位法 常用的思想&#xff1a;贡献法思想 下面详见优化2&#xff1a; 1.拆位贡献法 2.实战真题1 题目链接&#xff1a;1.异或和之和 - 蓝桥…

【金融风控项目-07】:业务规则挖掘案例

文章目录 1.规则挖掘简介2 规则挖掘案例2.1 案例背景2.2 规则挖掘流程2.3 特征衍生2.4 训练决策树模型2.5 利用结果划分分组 1.规则挖掘简介 两种常见的风险规避手段&#xff1a; AI模型规则 如何使用规则进行风控 **使用一系列逻辑判断(以往从职人员的经验)**对客户群体进行区…

第8章硬件维护-8.2 可维护性和可靠性验收

8.2 可维护性和可靠性验收 可维护性和可靠性验收非常重要&#xff0c;硬件维护工程师在后端发现问题后&#xff0c;总结成可维护性和可靠性需求&#xff0c;在产品立项的时候与新特性一起进行需求分析&#xff0c;然后经过设计、开发和测试环节&#xff0c;在产品中落地。这些需…

在k8s上部署minio

一、 环境 已部署k8s&#xff0c;支持helm部署 二、添加Minio Helm Chart仓库 helm repo add bitnami https://charts.bitnami.com/bitnami -n your_namespace helm repo update -n your_namespace部署带tls的minio helm install minio-s3 bitnami/minio -n your_namespace…

gtest 框架

基本了解 google提供的一个C测试框架&#xff0c;主要就是简化测试单元的书写&#xff0c;具有高效、灵活可拓展的特点 主要特点 简单易用&#xff1a;gtest 提供了清晰且易于使用的 API&#xff0c;便于开发者快速编写单元测试。丰富的断言支持&#xff1a;gtest 提供了多种断…