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

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

回答

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

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

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

什么字符可以用做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));

}

}

以上是 【Java】Spring @Cacheable 的key可以任意指定字符串吗? 的全部内容, 来源链接: utcz.com/a/90861.html

回到顶部