Spring @Cacheable 的key可以任意指定字符串吗?

我看到key好像只能诸如key="#id"这样,取参数值或者参数的field或者类的信息,我想自定义一些字符串,譬如listAll()方法的key定义为诸如“all”,有可能吗?

阅读 8.2k
4 个回答

key="#root.methodName"就是方法名

注解上应该有一个keyGenerator属性,自定义键值生成器,具体见文档 Default Key Generation

clipboard.png

什么字符可以用做Key取决于Cache具体实现, 以memcache为例, 最长250字符, 不能有空白字符(空格,换行,tab)等
参考下面的代码

import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

public class CacheUtils {

    private static final int MAX_KEY_LENGTH = 250;

    public static void validateKey(String key) {
        byte[] keyBytes = key.getBytes();
        if (keyBytes.length > MAX_KEY_LENGTH) {
            throw new IllegalArgumentException("Key is too long (maxlen = "
                    + MAX_KEY_LENGTH + ")");
        }
        if (keyBytes.length == 0) {
            throw new IllegalArgumentException(
                    "Key must contain at least one character.");
        }
        // Validate the key
        for (byte b : keyBytes) {
            if (b == ' ' || b == '\n' || b == '\r' || b == 0) {
                throw new IllegalArgumentException(
                        "Key contains invalid characters:  ``" + key + "''");
            }
        }
    }
    /**
     * @see <a href="http://blog.csdn.net/xiaojianpitt/article/details/7332950">memcache对键的要求 </a>
     * @param src 输入
     * @return 返回符合memcached要求的字符标识
     */
    public static String makeValidKey(String src){
        return StringUtils.mid(src.replaceAll("\\p{Cntrl}]|\\p{Space}|<null>", ""),0, MAX_KEY_LENGTH);
    }
    
    public static String makeValidKey(Object src){
        if(src instanceof Map){
            return makeValidKey(ConvertUtils.mapToString((Map<String, ?>)src));
        }
        if(src instanceof List){
            return makeValidKey(ConvertUtils.listToString((List<?>)src));
        }
        return makeValidKey(ToStringBuilder.reflectionToString(src, ToStringStyle.SIMPLE_STYLE));
    }
}
新手上路,请多包涵

可以使用单引号,key = "'all'",单引号不会被spel解析

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题