有人知道Ehcache的默认 key 生成如何工作吗?如果我有以下方法:

@Cacheable(cacheName = CACHE_KEY) // CACHE_KEY is static final field.
public List<DataObject> list(
    int firstRecord, int maxRecords, int pageSize, FilterObject filter) {
    ....
}
FilterObject是自定义POJO的地方,我应该指望什么是实际的缓存键?

我观察到的是,当使用不同的FilterObject实例并且不更改我的方法调用的其他参数时,它总是产生相同的结果-第一个调用的结果被缓存并返回。

可能是FilterObject POJO导致了此行为-我想这可能是一些序列化或.toString()问题,因为我没有重写相关方法。

我仍然无法在Ehcache的网站和@Cacheable注释文档中找到有关如何形成该方法的缓存键的确切信息。
感谢您提供有关此主题的任何信息和建议。

最佳答案

这是默认的 key 生成器

public class DefaultKeyGenerator implements KeyGenerator {

public static final int NO_PARAM_KEY = 0;
public static final int NULL_PARAM_KEY = 53;

public Object generate(Object target, Method method, Object... params) {
    if (params.length == 1) {
        return (params[0] == null ? NULL_PARAM_KEY : params[0]);
    }
    if (params.length == 0) {
        return NO_PARAM_KEY;
    }
    int hashCode = 17;
    for (Object object : params) {
        hashCode = 31 * hashCode + (object == null ? NULL_PARAM_KEY : object.hashCode());
    }
    return Integer.valueOf(hashCode);
}

}

如您所见,它结合了每个方法参数的哈希码。

07-26 05:04