【Java】Spring @Cacheable 的key可以任意指定字符串吗?
我看到key好像只能诸如key="#id"这样,取参数值或者参数的field或者类的信息,我想自定义一些字符串,譬如listAll()方法的key定义为诸如“all”,有可能吗?
回答
key="#root.methodName"
就是方法名
注解上应该有一个keyGenerator
属性,自定义键值生成器,具体见文档 Default Key Generation
什么字符可以用做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