jetcache的@CreateCache注解不生效

背景

最近在帮另外一个项目组的同学解决一些产品搭建的环境问题,商品模块早已正常启动,但访问类目查询接口,出现了空指针错误。

解决流程

先找到空指针的代码位置

通过堆栈日志,找到出现空指针的代码,大概是这个样子

@CreateCache(
    name = "BackCategory:ancestor",
    expire = 1800
)
private Cache<Long, List<BackCategory>> cache;

public List<BackCategory> cache(Long id) {
    return (List)this.cache.computeIfAbsent(id, (aLong) -> { // 出错的位置
        List<BackCategory> ancestors = Lists.newArrayListWithCapacity(4);

        BackCategory current;
        for(Long currentId = aLong; currentId > 0L; currentId = current.getPid()) {
            current = (BackCategory)this.backCategoryDAO.findById(currentId);
            if (current == null || 1 != current.getStatus()) {
                throw new ServiceException("backCategory.not.found");
            }

            ancestors.add(current);
        }

        return ancestors;
    });
}

问题出现在第8行,通过观察发现是缓存的相关问题,应该是@CreateCache注解并未生效

检查是否因配置问题导致的@CreateCache不生效
首先检查是否引入了相应的配置文件

通过对启动文件中引入的配置文件的一层层的翻阅,找到了相应的配置文件,如下图所示
在这里插入图片描述

说明已经开启了使用jetcache需要的相关注解。

然后检查application.yml中对jetcache的配置

在这里插入图片描述
也是正常配置,没有任何问题,并未配置jetcache的关闭操作。

依然配置文件没有问题,那只能通过翻阅代码去判断了
首先在idea中下载jetcache依赖的源码
浏览@EnableCreateCacheAnnotation注解逻辑

因为@EnableCreateCacheAnnotation注解的作用就是开启@CreateCache注解的功能,所以推测处理打了CreateCache成员变量的逻辑应该是可以在这里边找到的。
在这里插入图片描述

进入该注解的申明文件中查看,发现他引入了一个叫做CreateCacheAnnotationBeanPostProcessor的bean处理器,看名字就已经很明显了,CreateCache的处理逻辑大概率就在这里了。
在这里插入图片描述
CreateCacheAnnotationBeanPostProcessor 处理器继承至AutowiredAnnotationBeanPostProcessor,并且重写了其中的setBeanFactory方法以及postProcessPropertyValues方法。
在这里插入图片描述
这里是对打了该注解的字段进行筛选,筛选完后在这里进行处理
在这里插入图片描述

主要逻辑也就是直接进行初始化了,然后再塞回到这个字段对应的bean里边
在这里插入图片描述

代码看起来似乎在初始化的逻辑上也没有问题,那只能debuge一下启动流程看看是不是CreateCacheAnnotationBeanPostProcessor处理器中的postProcessPropertyValues方法执行时出现问题了。
在方法的第一行打上断点直接debuge启动流程。

发现该方法居然没有执行,那么CreateCache肯定是不会生效了

检查逻辑未执行的原因
检查执行postProcessPropertyValues的位置

利用idea直接找用到调用postProcessPropertyValues的地方,是在这个类里AbstractAutowireCapableBeanFactory
在这里插入图片描述
主要逻辑如上图所示,只有postProcessProperties执行的结果是null,才会调用后置处理器的postProcessPropertyValues。说明CreateCacheAnnotationBeanPostProcessor对象调用postProcessProperties方法后的结果不为null。但是我们一开始也看了,在CreateCacheAnnotationBeanPostProcessor注解中并未重写postProcessProperties,说明这个方法时继承下来的。所以我们去看这个类AutowiredAnnotationBeanPostProcessor中有没有相关方法。
在这里插入图片描述
该方法的调用逻辑果然在这里,debuge过程中发现pvs的值不为null,这也难怪最后postProcessPropertyValues方法不执行了。

总结

到这里可以说已经找到CreateCache注解不生效的原因了,因为没有执行到CreateCacheAnnotationBeanPostProcessor中的postProcessPropertyValues,那为啥没执行呢,我去网上看了一下,是因为这个方法(postProcessPropertyValues)在spring后续的版本中被弃用了。然后我看了一下项目中spring-boot的版本,发现他们对其进行了升级。那问题也就出来了,升级的spring-boot版本后,导致jetcache的@CreateCache无法生效

解决方案

升级jetcache版本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值