Автоматическая генерация ключей Ehcache и аннотация @ Cacheable spring

кто-нибудь знает, как работает генерация ключей по умолчанию для Ehcache? Если у меня есть следующий метод:

@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 аннотаций документации. Буду признателен за любую информацию и рекомендации по этой теме.

2 ответов


это генератор ключей по умолчанию

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);
}

}

Как вы можете видеть, он объединяет хэш-коды каждого параметра метода.


все объясняется весной документация, а именно:

28.3.1.1 Генерация Ключей По Умолчанию:

[...]

  • если задано больше одного параметра, верните ключ вычисляется из хэшей всех параметров.

чтобы обеспечить другой генератор ключей по умолчанию, необходимо реализовать org.springframework.cache.KeyGenerator интерфейс. После настройки генератор используется для каждого объявления, не указывающего собственную стратегию генерации ключей (см. ниже).

и ниже:

28.3.1.2 Объявление Генерации Пользовательских Ключей:

[...] аннотация @Cacheable позволяет пользователю указать, как ключ генерируется через его ключевой атрибут. Разработчик может использовать SpEL для выбора аргументов, представляющих интерес[...]

и пример с docs:

@Cacheable(value="books", key="#isbn.rawNumber")
public Book findBook(ISBN isbn, boolean checkWarehouse, boolean includeUsed)

так что в вашем случае вы должны просто реализовать equals() и hashCode() на FilterObject. Достойная IDE может генерировать их для вас.