ehcache:Null key returned for cache operation问题解决方法

﹏ヽ暗。殇╰゛Y 2022-12-10 11:26 309阅读 0赞

前言

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

报错详情

  1. 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,false
  2. at org.springframework.cache.interceptor.CacheAspectSupport.generateKey(CacheAspectSupport.java:578)
  3. at org.springframework.cache.interceptor.CacheAspectSupport.performCacheEvict(CacheAspectSupport.java:492)
  4. at org.springframework.cache.interceptor.CacheAspectSupport.processCacheEvicts(CacheAspectSupport.java:476)
  5. at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:433)
  6. at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:345)
  7. at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61)

检查思路

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

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

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

  1. /** * 新增或编辑 */
  2. @PostMapping("/save")
  3. @CacheEvict(value = EhCacheUtil.CACHE_NAME_CERT_COMPANY, key = EhCacheUtil.CACHE_KEY_CERT_COMPANY_OBJ)
  4. public Object save(@RequestBody CertCompany certCompany){
  5. log.info("certCompany:"+JSON.toJSONString(certCompany));
  6. CertCompany oldCertCompany = certCompanyMapper.selectOne(new QueryWrapper<CertCompany>().eq("cert_id",certCompany.getCertId()));
  7. certCompany.setUpdateTime(new Date());
  8. if(oldCertCompany!=null){
  9. certCompanyMapper.updateById(certCompany);
  10. }else{
  11. if(certCompanyMapper.selectOne(new QueryWrapper<CertCompany>().eq("cert_number",certCompany.getCertNumber()))!=null){
  12. return ReturnT.ERROR("保存失败,名字重复");
  13. }
  14. //创建MiniCode
  15. certCompanyMapper.insert(certCompany);
  16. }
  17. //省略部分业务逻辑
  18. //清空列表缓存
  19. cacheService.cleanCompanyListByPageLimit();
  20. return ReturnT.SUCCESS("保存成功");
  21. }

解决方案

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

发表评论

表情:
评论列表 (有 0 条评论,309人围观)

还没有评论,来说两句吧...

相关阅读