前言

今天一个上线许久的系统突然无法新增证书,但是不是所有都不允许新增,只是编号重复的无法新增。从逻辑上想,我是设置了编号重复判断,但是该业务判断逻辑未生效,从缓存上将,会不会是id=null导致的问题。

报错详情

java.lang.IllegalArgumentException: Null key returned for cache operation (maybe you are using named params on classes without debug info?) Builder[public java.lang.Object com.egag.cert.controller.CertCompanyController.save(com.egag.cert.entity.CertCompany)] caches=[cache-certCompany] | key='#certCompany.certId' | keyGenerator='' | cacheManager='' | cacheResolver='' | condition='',false,falseat org.springframework.cache.interceptor.CacheAspectSupport.generateKey(CacheAspectSupport.java:578)at org.springframework.cache.interceptor.CacheAspectSupport.performCacheEvict(CacheAspectSupport.java:492)at org.springframework.cache.interceptor.CacheAspectSupport.processCacheEvicts(CacheAspectSupport.java:476)at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:433)at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:345)at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61)

检查思路

报错信息非常清晰,首先是缓存报错,另一方面是发生在新增的情况(id = null / 0)编号重复的情况,编辑旧的数据则不会影响。

public class EhCacheUtil {public static final String CACHE_NAME_CERT_COMPANY="cache-certCompany";public static final String CACHE_NAME_CERT_COMPANY_LIST="cache-certCompanyList";public static final String CACHE_KEY_CERT_COMPANY_OBJ="#certCompany.certId";public static final String CACHE_KEY_CERT_COMPANY_ID="#id";//省略其他
}

思来想去莫非是新增的对象在缓存中判断不严谨,因为我们重点在于更新旧的数据,新的数据查询的时候自己加载到缓存就可以了。于是我们需要增加一个condition的参数。

   /*** 新增或编辑*/@PostMapping("/save")@CacheEvict(value = EhCacheUtil.CACHE_NAME_CERT_COMPANY, key = EhCacheUtil.CACHE_KEY_CERT_COMPANY_OBJ)public Object save(@RequestBody CertCompany certCompany){log.info("certCompany:"+JSON.toJSONString(certCompany));CertCompany oldCertCompany = certCompanyMapper.selectOne(new QueryWrapper<CertCompany>().eq("cert_id",certCompany.getCertId()));certCompany.setUpdateTime(new Date());if(oldCertCompany!=null){certCompanyMapper.updateById(certCompany);}else{if(certCompanyMapper.selectOne(new QueryWrapper<CertCompany>().eq("cert_number",certCompany.getCertNumber()))!=null){return ReturnT.ERROR("保存失败,名字重复");}//创建MiniCodecertCompanyMapper.insert(certCompany);}//省略部分业务逻辑//清空列表缓存cacheService.cleanCompanyListByPageLimit();return ReturnT.SUCCESS("保存成功");}

解决方案

public class EhCacheUtil {public static final String CACHE_NAME_CERT_COMPANY="cache-certCompany";public static final String CACHE_NAME_CERT_COMPANY_LIST="cache-certCompanyList";public static final String CACHE_KEY_CERT_COMPANY_OBJ="#certCompany.certId";//zhengkai.blog.csdn.net 新增以解决Null key returned for cache operation问题public static final String CACHE_KEY_CERT_COMPANY_OBJ_NOTNULL="#certCompany.certId !=null ";public static final String CACHE_KEY_CERT_COMPANY_ID="#id";//省略其他
}
   /*** 新增或编辑*/@PostMapping("/save")@CacheEvict(value = EhCacheUtil.CACHE_NAME_CERT_COMPANY, key = EhCacheUtil.CACHE_KEY_CERT_COMPANY_OBJ,condition = EhCacheUtil.CACHE_KEY_CERT_COMPANY_OBJ_NOTNULL)public Object save(@RequestBody CertCompany certCompany){//省略业务逻辑}

ehcache:Null key returned for cache operation问题解决方法相关推荐

  1. android getChildAt(index)返回null问题解决方法

    android getChildAt(index)返回null问题解决方法 参考文章: (1)android getChildAt(index)返回null问题解决方法 (2)https://www. ...

  2. Java was started but returned exit code=13 问题解决

    Java was started but returned exit code=13 问题解决 参考文章: (1)Java was started but returned exit code=13 ...

  3. 关于Clipboard剪切板获取值为NULL问题解决方法

    关于Clipboard剪切板获取值为NULL问题解决方法 参考文章: (1)关于Clipboard剪切板获取值为NULL问题解决方法 (2)https://www.cnblogs.com/machen ...

  4. Spring Tool Suite(STS)启动时出现错误:Java was started but returned exit code=13问题解决

    Spring Tool Suite(STS)启动时出现错误:Java was started but returned exit code=13问题解决 参考文章: (1)Spring Tool Su ...

  5. SpringBoot集成Redis报non null key required(已解决)

    SpringBoot集成Redis报non null key required(已解决) 注意是不是给的key值或传过来的值是不是空的,如果是空的就会报这个错 接下来将流程走下去: 1.创建Sprin ...

  6. 解决Null key for a Map not allowed in JSON (use a converting NullKeySerializer?)

    我们在写程序的时候提示警告或者报错: Null key for a Map not allowed in JSON (use a converting NullKeySerializer?) 或者 o ...

  7. Oracle 常见错误总结(如:ORA-XXXXX)及问题解决方法

    转: Oracle 常见错误总结(如:ORA-XXXXX)及问题解决方法 ORA-00001: 违反唯一约束条件 ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 O ...

  8. mysql c 中文字符串_MySQL字符集中文乱码终极解决方案和mysql查询中文问题解决方法...

    开源数据库MySQL从来都是中小企业构建web应用的首选,特别是和PHP配合简直就是一 对黄金搭档,深受web开发人员的喜爱.但自从4.1以来MySQL加入了多字符集的支持,很多MySQL使用者发现中 ...

  9. Field 'id' doesn't have a default value问题解决方法

    Field 'id' doesn't have a default value问题解决方法 突然想温习温习对数据库的读写,于是就用mysql建了一张单独的表(见代码1),用Hibernate写了个应用 ...

  10. java setmethod_Java Operation.setJavaMethod方法代码示例

    import com.sun.tools.internal.ws.processor.model.Operation; //导入方法依赖的package包/类 private void createJ ...

最新文章

  1. 信息安全的一些东西,初步查询了解!
  2. 前端二十七:四彩边框
  3. python 使用win32com 操作excel
  4. 主线程等待线程池所有任务完成
  5. 并查集:P1196 [NOI2002] 银河英雄传说
  6. STM32 - 高级定时器的设定 - 基础-05 - 输出波形控制 -Complementary outputs and dead-time insertion 相位调整@互补输出和死区控制
  7. Java 面试之线程与锁
  8. android 服务是什么问题,Android Studio 中的Service问题
  9. android8.0于与ios,android 8.0 oreo抄袭苹果吗 android oreo和ios 11对比
  10. Linux文件类型及颜色标识整理
  11. 【学堂在线数据挖掘:理论方法笔记】第二天(3.18)
  12. 25条实用简洁的Python代码
  13. 案例:仿小米logo过渡渐变效果
  14. 拨号保护,网络电话,保护隐私,匿名通话
  15. csgo/5e机器码解封方法,永久性解除,重装系统都不掉
  16. 根据三个点的坐标计算三角形面积
  17. 任意重循环(循环阶数不定、循环层数不定)
  18. 字节跳动2018校招前端面试题
  19. python数据清洗笔记
  20. 磁共振t1t2信号记忆顺口溜_MRI的T1和T2

热门文章

  1. 无线路由器的dhcp服务器如何设置,无线路由器怎么设置dhcp服务器
  2. 阿里云虚拟主机部署php项目分享
  3. 戴口罩写代码,程序员干脆穿越到了古代
  4. 独立键盘检测,矩阵键盘检测
  5. Python实现EM
  6. 用计算机rap歌词,Rap歌词
  7. strut-控制器ActionServlet类详解
  8. 盘点苹果电脑上那些不错的cpu优化工具
  9. android拦截所有短信源码,Android手机防短信电话骚扰宝典 手机也会思考
  10. 安装Windows服务报错:未能加载文件或程序集