SpringCache 设置key时如何添加常量?

问题描述

使用redis缓存数据时取名需要根据后台session得到id,从而对不同用户取不同的缓存名

问题出现的环境背景及自己尝试过哪些方法

查了很多搜索引擎,都基本是那几篇的描述,不奏效

相关代码

//BaseContext.getCurrentId()是为了获取前端传来的id
public static final String DIY_ID = String.valueOf(BaseContext.getCurrentId());

//在对某个方法使用缓存时,缓存名需要根据传来的id取,但这样写编译不通过:Attribute value must be constant
@Cacheable(value = "ShoppingCar",key = DIY_ID+"'_car'")

你期待的结果是什么?实际看到的错误信息又是什么?

错误消息:Attribute value must be constant
期待大佬们给点建议对于key赋值时添加常量

阅读 2.3k
1 个回答

方法一
BaseContext.getCurrentId() 的值放在一个 bean 中。

@Service
public class Current {
    private static ThreadLocal<String> threadLocal = new ThreadLocal<>();

    public void setCurrentId() {
        threadLocal.set(BaseContext.getCurrentId());
    }

    public static String getCurrentId() {
        return threadLocal.get();
    }
}

使用时加上注解
@Cacheable(value = "ShoppingCar",key = "@current.getCurrentId()")

使用 key 时,加上 @ 符号,就能告诉 spring boot 利用 name 获取 bean。

方法二
currentId 传入方法作为参数,利用 spring boot 自带的 {#currentId, '_car'} 表达式,加上后缀。

    @Cacheable(value = "mainFieldInfo", key = "{#currentId, '_car'}")
    public void test(String currentId) {
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题