Как использовать @CachePut и @CacheEvict в одном методе в приложении Spring Boot? - PullRequest
1 голос
/ 20 июня 2020

Я работаю над приложением Spring Boot, где у меня есть сценарий, позволяющий использовать @CachePut и @CacheEvict одним и тем же методом.

Я пробовал сценарий с этим кодом, приведенным ниже:

@CachePut(value="myValue",key="#entity.getId(),#entity.getOrgId()", 
          cacheManager="no-expire-caching")
@CacheEvict(value="myValue", key="#entity.getId(),#entity.getOrgId()",
          cacheManager="no-expire-caching", condition="#entity.isDeleted() == true")
public MyEntity save(boolean flag, MyEntity entity){
    if (flag==true){
        entity.setIsDeleted(true);
        return myRepo.save(entity);
    }
    return myRepo.save(entity);
}

Но, похоже, это не работает должным образом.

Цели:

  • Я хочу @CachePut аннотацию к всегда выполнять в первую очередь, так как это будет первая проверка для обновления кеша.

  • @CacheEvict выполняется всякий раз, когда выполняется условие (т.е. поле isDeleted установлено в true)

  • Я не хочу, чтобы мой кеш обновлялся или добавлял новую запись, если isDeleted установлен на true.

Можно ли этого добиться весной? Как мне изменить свой код?

1 Ответ

1 голос
/ 20 июня 2020

Вы можете добиться использования нескольких разных аннотаций кеша для одного и того же метода в Spring, используя аннотацию @Caching.

Примечание: Это работает, когда используются разные кеши.

Согласно Документам по абстракции Spring Cache :

Когда необходимо указать несколько аннотаций, таких как @CacheEvict или @CachePut, в тот же метод для разных кешей.

Затем для этого можно использовать @Caching. @Caching позволяет использовать несколько вложенных @Cacheable, @CachePut и @CacheEvict в одном методе.

Попробуйте это (если это работает):

@Caching(put={@CachePut(value="myValue",key="#entity.getId(),#entity.getOrgId()", 
          cacheManager="no-expire-caching")}, evict = {@CacheEvict(value="myValue", key="#entity.getId(),#entity.getOrgId()",
          cacheManager="no-expire-caching", condition="#entity.isDeleted() == true")})
public MyEntity save(boolean flag, MyEntity entity){
    if (flag==true){
        entity.setIsDeleted(true);
        return myRepo.save(entity);
    }
    return myRepo.save(entity);
}

@ Кэширование Java Документы для справки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...