今天遇到了一个情况 就是同一个类中 A调用B有@Cacheable B的数据没有进入缓存中
一开始不理解啊
如代码:
/**
*查找出操作人员角色级别最高值
* @param adminId
* @return Integer
* @author zhangjunrong
* @date 2022/3/29 15:27
*/
@Cacheable(cacheNames = "role",key = "level+#adminId")
public Integer checkLevel(Long adminId) {
//1.先找出他的全部角色
QueryWrapper<AdminRole> wrapper = new QueryWrapper<>();
//中间表 admin_mid_role 查出role_id
String queryRoleId="select role_id from yqs.admin_mid_role where admin_id="+adminId;
wrapper.select("role_level")
.inSql("pk_id",queryRoleId);
//2.筛选出最高级别的数 1 max
Integer level= null;
try {
level = Collections.min(adminRoleMapper.selectList(wrapper).stream().filter(Objects::nonNull).map(AdminRole::getRoleLevel).collect(Collectors.toList()));
} catch (Exception e) {
throw new YqsException(MessageEnum.NO_PERMISSION.getCode(),"该工作人员没有角色");
}
return level;
}
@Override
public List<AdminRole> queryRoles(Long adminId) {
//查出自己角色的最高的等级
Integer level = checkLevel(adminId);
System.err.println(level);
QueryWrapper<AdminRole> wrapper = new QueryWrapper<>();
//排除比自己高等级的
wrapper.gt("role_level",level);
return adminRoleMapper.selectList(wrapper);
}
然后呢结果
到网上查找了点
说跟@Transactional有点相同 切面AOP原理
因为@Cacheable 是使用AOP 代理实现的 ,通过创建内部类来代理缓存方法,这样就会导致一个问题,类内部的方法调用类内部的缓存方法不会走代理,不会走代理,就不能正常创建缓存,所以每次都需要去调用数据库
解决方法:
1.直接用工具包RedisUtils 去放缓存里
redisUtil.set("roleLevel:"+adminId,level);
2.把该方法放缓存方法放其他地方去