Выселение не работает в весенней загрузке

У меня есть метод, который извлекает все данные, и я кэширую результат этого метода, но я не могу удалить результат.

@Component("cacheKeyGenerator")
public class CacheKeyGenerator implements KeyGenerator {

    @Override
    public Object generate(Object target, Method method, Object... params) {
        final List<Object> key = new ArrayList<>();
        key.add(method.getDeclaringClass().getName());
        return key;
    }
}

Кэшированный метод: -

 @Override
        @Cacheable(value="appCache",keyGenerator="cacheKeyGenerator")
        public List<Contact> showAllContacts() {
            return contactRepository.findAll();
        }

    @Override
        @CachePut(value="appCache",key="#result.id")
        public Contact addData(Contact contact) {
            return contactRepository.save(contact);
        }

Теперь, когда когда-либо вызывается addData, я хочу, чтобы данные в кеше «appCache» с ключом ="cacheKeyGenerator" были удалены. Чтобы данные, возвращаемые методом «showAllContacts()», были точными. Кто-нибудь может помочь!

Весь код можно найти по адресу - https://github.com/iftekharkhan09/SpringCaching.


person Sunny    schedule 14.10.2017    source источник
comment
использовать другой метод @CacheEvict для удаления кэшированной записи? Это то, что вы ищете?   -  person Barath    schedule 15.10.2017
comment
Глядя на вашу текущую реализацию, возникает один вопрос: вы собираетесь вытеснять кеш при вызове add(...), потому что вы явно вызываете пустой (но аннотированный) метод evictCache()?   -  person fateddy    schedule 15.10.2017


Ответы (1)


Предполагая, что у вас есть известный постоянный ключ кеша для showAllContacts, тогда решение должно состоять в том, чтобы просто добавить @CacheEvict к addData, передав имя кеша и значение ключа:

@Override
@Caching(
    put = {@CachePut(value="appCache", key="#result.id")},
    evict = {@CacheEvict(cacheNames="appCache", key="someConstant")}
)
public Contact addData(Contact contact) {
    return contactRepository.save(contact);
}

Однако, поскольку вы используете генератор ключей, это немного сложнее. Теперь, учитывая то, что делает ваш генератор ключей, вы могли бы вместо этого выбрать значение для этого ключа кэша, убедившись, что не может быть каких-либо конфликтов со значениями из #result.id, и использовать это значение вместо значения, возвращенного генератором ключей.

person Louis Jacomet    schedule 14.11.2017