Spring Cache常见问题解决

目录

一 报错:Null key returned for cache operation

二 报错:类型转换异常

三 取出的数据为null


一 报错:Null key returned for cache operation

这里报错有两种情况:

第一,如果你在新增的方法上使用Cacheable注解,那么肯定是会报这个错误的。

因为Cacheable注解的原理是先根据key去Redis查看有没有这个缓存数据 , 如果没有在保存。

那么问题就出现了 , 我们传入的新增的参数肯定是不会带有主键id的,那么此时他根据id去查找key,而你的id是null,他就会报这个错误。

解决办法:

换成CachePut注解,因为这个注解不会先去查找,而是直接添加到缓存中,所以就不存在这个情况。

第二,使用的是CachePut,但还是报这个错误。

这个情况,肯定是因为你使用的是xxxDTO来接收前端的参数,而不是直接使用xxx的实体类来接受,这样就导致一个问题,就是前端传来的参数主键id肯定一开始也是null , 二主键的回显是在调用的mapper层之后才生成的,而错就错在,你是用xxx实体类对象来接收回显的主键,而不是xxxDTO这个参数对象,那么当整个方法执行完后,xxxDTO这个参数的id一直都是null,而注解是这样的:

@CachePut(cacheNames = "dishCache" , key = "#dishDTO.id")

他是根据xxxDTO来获取id的,所以会报key为null。

解决办法:

当然,我们肯定不能直接换成实体类来接收前端传来的参数,因为毕竟可能有些属性实体类没有需要我们使用xxxDTO来接收。所以我们可以在主键回显后,  把主键赋值给xxxDTO就可以了,具体代码如下:

     /*
            为什么这里要多此一举给参数dishDTO赋值id呢?因为上面在使用springCache需要从dishDTO获取id生成key,
            但是dishDTO中的参数在这个方法执行完一直都是null , 主键回显只会回显在dish对象中的id。
            所以springCache得不到id就会报错 , 所以需要给dishDTO的id赋值。
         */
        dishDTO.setId(dish.getId());

二 报错:类型转换异常

这个问题一定是因为你存入数据的注解和取出数据的注解放在不一样的层的方法上。

最常见的是,你把CachePut方法放在Controller层的方法上,那么你存入的数据肯定是一个Result类型的数据。而你把Cacheable注解方法Server层方法上,那么该方法返回的肯定是一个xxx实体类,这就会导致,你存入的数据是一个Result类,而你需要取的数据又变成了xxx实体类,从而导致报错。

解决办法:

你可以全部放在Server层,或者全部放在Controller,只要确保你存入数据的方法的返回数据类型和你取出方法的返回数据类型一致就可以。 

三 取出的数据为null

这个不用看,一定是因为你存入缓存的注解放在了一个返回为void的方法上面。

你只需要记住,springCache的注解,他的存入和取出的数据的类型一定是根据你的方法的返回值来的。如果你的返回值类型是void,那么他存入缓存的数据就是null,所以你取出来肯定也是null。 

演示代码如下;

 @CachePut(cacheNames = "dishCache" , key = "#dishDTO.id")
    @Override
    public void addDish(DishDTO dishDTO) {
//        向菜品表插入数据
        Dish dish = new Dish();
        BeanUtils.copyProperties(dishDTO , dish);
        dishMapper.addDish(dish);
//        因为下面的菜品口味表需要使用到菜品的id,所以这里菜品完成后,需要获取菜品id,再赋值给菜品口味
        Long dishId = dish.getId(); //但是这个id不能直接得到,需要在sql中使用主键回显,才能把生成的主键返回

        /*再根据菜品id,新增菜品口味表*/
//        取出集合数据
        List<DishFlavor> flavors = dishDTO.getFlavors();
        if (flavors!=null && flavors.size()>0){
//            这里需要遍历集合中每一个dishFlavor对象,把dishId赋值给他们
            flavors.forEach(dishFlavor -> {dishFlavor.setDishId(dishId);});
            dishFlavorMapper.addDishFlavor(flavors) ;
        }

        /*
            为什么这里要多此一举给参数dishDTO赋值id呢?因为上面在使用springCache需要从dishDTO获取id生成key,
            但是dishDTO中的参数在这个方法执行完一直都是null , 主键回显只会回显在dish对象中的id。
            所以springCache得不到id就会报错 , 所以需要给dishDTO的id赋值。
         */
        dishDTO.setId(dish.getId());
    }

 取出的值如下:

解决方法:

把方法的返回值类型由viod改成对应的需要存储的数据的实体类型。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

终极解决方案,传统极速方案,下载软件的双雄对决!

在数字资源日益丰富的今天&#xff0c;下载管理器成为了我们日常生活中不可或缺的工具。市场上两款备受欢迎的下载管理软件——Internet Download Manager&#xff08;IDM&#xff09;和迅雷11&#xff0c;它们以各自的特色和优势&#xff0c;满足了不同用户群体的需求。 软件…

5.3 Python len()函数:获取字符串长度或字节数

Python len()函数详解&#xff1a;获取字符串长度或字节数 Python 中&#xff0c;要想知道一个字符串有多少个字符&#xff08;获得字符串长度&#xff09;&#xff0c;或者一个字符串占用多少个字节&#xff0c;可以使用 len 函数。 len 函数的基本语法格式为&#xff1a; …

python-今年第几天

[题目描述] 定义一个结构体变量&#xff08;包括年、月、日&#xff09;。 计算该日在本年中是第几天&#xff0c;注意闰年问题。输入格式&#xff1a; 年 月 日。输出格式&#xff1a; 当年第几天。样例输入 2000 12 31样例输出 366 数据范围 对于100%的数据&#xff0c;保…

解决MNIST数据集下载慢,或者Http连接失败问题

下载MNIST数据集时遇到速度慢的问题 解决&#xff1a;手动从MNIST数据集的官方网站直接使用下载好的数据文件&#xff0c;放到指定目录下&#xff0c;再进行调取即可。 手动下载地址&#xff1a;MNIST官网 http://yann.lecun.com/exdb/mnist/ 【仍需要连接外网】 这里我提供…

ATA-4052C高压功率放大器在新能源汽车安全测试中的应用

新能源汽车的崛起已经改变了汽车行业的格局&#xff0c;为环境友好型交通方式提供了更多的选择。为了确保这些新型汽车的安全性和可靠性&#xff0c;进行全面的安全测试是至关重要的。高压功率放大器在新能源汽车的安全测试中发挥着重要的作用&#xff0c;本文将介绍其应用以及…

已解决:Vector析构异常Opencv Assert _CrtIsValidHeapPointer

已解决&#xff1a;Vector析构异常Opencv Assert _CrtIsValidHeapPointer 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身&#xff0c;就职于医疗科技公司&#xff0c;热衷分享知识&#xff0c;武汉…

PathDecider 详细解读

目录 PathDecider的主要功能 PathDecider代码分析 Process() MakeObjectDecision() MakeStaticObstacleDecision() MakeStaticObstacleDecision()的流程图​编辑 MakeStaticObstacleDecision()的代码解析 GenerateObjectStopDecision() PathDecider里用到的其他函数 …

C语言入门4-函数和程序结构

函数举例 读取字符串&#xff0c;如果字符串中含有ould则输出该字符串&#xff0c;否则不输出。 #include <stdio.h>// 函数声明 int getLine(char s[], int lim); int strindex(char s[], char t[]);int main() {char t[] "ould"; // 要查找的目标子字符串…

自然语言处理学习路线(1)——NLP的基本流程

NLP基本流程 【NLP基本流程】 0. 获取语料 ——> 1. 语料预处理 ——> 2. 特征工程&选择 ——> 3. 模型训练 ——> 4. 模型输出&上线 【NLP基本流程图】 Reference 1. 自然语言处理(NLP)的一般处理流程&#xff01;-腾讯云开发者社区-腾讯云 2. …

Vatee万腾平台:智能科技的领航者

随着科技的飞速发展&#xff0c;数字化转型已成为企业、行业乃至整个社会不可逆转的趋势。在这个变革的浪潮中&#xff0c;Vatee万腾平台凭借其卓越的技术实力、前瞻的战略眼光和卓越的服务品质&#xff0c;成为了智能科技的领航者。 Vatee万腾平台致力于为企业提供全方位的数字…

【Python机器学习】利用t-SNE进行流形学习

虽然PCA通常是用于变换数据的首选方法&#xff0c;使你能够用散点图将其可视化&#xff0c;但这一方法的性质限制了其有效性。 有一类用于可视化的算法叫做流形学习算法&#xff0c;它允许进行更复杂的映射&#xff0c;通常也可以给出更好的可视化。其中特别有用的一个就是t-S…

google gemini1.5 flash视频图文理解能力初探(一)

市面能够对视频直接进行分析的大模型着实不多&#xff0c;而且很多支持多模态的大模型那效果着实也不好。 从这篇公众号不只是100万上下文&#xff0c;谷歌Gemini 1.5超强功能展示得知&#xff0c;Gemini 1.5可以一次性处理1小时的视频、11小时的音频或100,000行代码&#xff0…

c++设计模式之一创建型模式

1、创建型模式&#xff08;常见的设计模式&#xff09; Factory 模式&#xff08;工厂模式&#xff0c;被实例化的子类&#xff09; 在面向对象系统设计中经常可以遇到以下的两类问题&#xff1a; 下面是第一类问题和代码示例&#xff1a;我们经常会抽象出一些类的公共接口以…

stm32学习笔记---新建工程步骤和点灯演示

目录 STM32的三种开发方式 基于寄存器的方式 基于库函数的方式 基于Hal库的方式 固件库介绍 新建基于标准库的工程步骤 配置寄存器来完成点灯操作 添加库函数来完成点灯操作 添加库函数 开始点灯操作 第一步&#xff1a;使能时钟 第二步&#xff1a;配置端口模式 …

ic基础|功耗篇03:ic设计人员如何在代码中降低功耗?一文带你了解行为级以及RTL级低功耗技术

大家好&#xff0c;我是数字小熊饼干&#xff0c;一个练习时长两年半的ic打工人。我在两年前通过自学跨行社招加入了IC行业。现在我打算将这两年的工作经验和当初面试时最常问的一些问题进行总结&#xff0c;并通过汇总成文章的形式进行输出&#xff0c;相信无论你是在职的还是…

鞠婧祎多个商标被丝芭传媒申请注册!

近日鞠婧祎与丝芭传媒合约引发网络关注&#xff0c;普推商标老杨经检索发现&#xff0c;丝芭传媒早在2016起就申请注册了“鞠婧祎”24个商标&#xff0c;涉及多个商标分类&#xff0c;这些基本都下商标注册证。 不管对经纪公司还是网红公司&#xff0c;有实力的基本都会对旗下的…

# Kafka_深入探秘者(2):kafka 生产者

Kafka_深入探秘者&#xff08;2&#xff09;&#xff1a;kafka 生产者 一、kafka 消息发送流程解析 1、kafka &#xff1a;java 客户端 数据生产流程解析 二、kafka 发送类型 1、kafka 发送类型–发送即忘记&#xff1a;producer.send(record) 同步发送 //通过 send() 发送完…

【Vue3组件】分享一下自己写的简约风格评论区组件

代码比较简单&#xff0c;方便大家二次开发&#xff0c;旨在快速提供基础的样式模板&#xff0c;自行迭代定制 预览 简介 通用评论组件 组件功能 此组件旨在创建一个具备嵌套回复能力的通用评论区域&#xff0c;适用于构建动态、互动性强的用户讨论场景。 接收数据结构 组件通…

Paimon Trino Presto的关系 分布式查询引擎

Paimon支持的引擎兼容性矩阵&#xff1a; Trino 是 Presto 同项目的不同版本&#xff0c;是原Faceboo Presto创始人团队核心开发和维护人员分离出来后开发和维护的分支&#xff0c;Trino基于Presto&#xff0c;目前 Trino 和 Presto 都仍在继续开发和维护。 Trino 生态系统-客…

虚拟机IP地址频繁变化的解决方法

勾八动态分配IP&#xff0c;让我在学习redis集群的时候&#xff0c;配置很多的IP地址&#xff0c;但是由于以下原因导致我IP频繁变动&#xff0c;报错让我烦恼&#xff01;&#xff01;&#xff01;&#xff01; 为什么虚拟机的IP地址会频繁变化&#xff1f; 虚拟机IP地址频繁…