Проблема с кешированием при использовании метода без параметров @Cacheable - PullRequest
1 голос
/ 24 апреля 2020

Я пытаюсь реализовать кэширование Spring в сервисе Spring Boot RESTful. Это кеширующий код для методов getAllBlogs () и getBlogById ().

@Cacheable(value="allblogcache")
@Override
public List<Blog> getAllBlogs() {
    System.out.println("******* "+ blogRepository.findAll().toString());
    return (List<Blog>) blogRepository.findAll();

}

@Cacheable(value="blogcache", key = "#blogId")
@Override
public Blog getBlogById(int blogId) {
    Blog retrievedBlog = null;
    retrievedBlog = blogRepository.findById(blogId).get();
    return retrievedBlog;
}

В методе saveBlog я хочу удалить кэш и использовал следующий код.

 @Caching(evict = {
        @CacheEvict(value="allblogcache"),
        @CacheEvict(value="blogcache", key = "#blog.blogId")
  })
  @Override
  public Blog saveBlog(Blog blog) {
    return blogRepository.save(blog);
  }

При запуске я сделал следующее с помощью Почтальона:

  1. Сохранены два блога. Оба блога сохраняются в базе данных.
  2. называется get Все блоги. Оба сохраненных блога возвращаются.
  3. Сохранен новый блог. Здесь я предполагаю, что кеш был удален.
  4. Я позвонил, чтобы получить все блоги. Однако возвращаются только два блога. Это означает, что блоги возвращаются из старого кэша. Это не было выселено при вызове третьего сохранения.

Репозиторий Github находится в https://github.com/ximanta/spring-cache

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

Вам необходимо добавить атрибут allEntries = true, если вы извлекаете кэши без указания ключа (см. документы ).

В вашем случае это будет @CacheEvict(value="allblogcache", allEntries = true)

PS протестировал его и сумел заставить его работать. PR: https://github.com/ximanta/spring-cache/pull/1

0 голосов
/ 27 апреля 2020

Выдает исключение, потому что вы используете неверное ключевое выражение:

@Caching(evict = {
    @CacheEvict(value="allblogcache"),
    @CacheEvict(value="blogcache", key = "#blogId")
                                         ~~~~~~~~~~ => Refer to parameter blogId but not found
})
public Blog saveBlog(Blog blog)

Правильное выражение:

@Caching(evict = {
    @CacheEvict(value="allblogcache"),
    @CacheEvict(value="blogcache", key = "#blog.id") // Assume that the property for blog ID is "id"
})
public Blog saveBlog(Blog blog)
...