SpringBoot Cache, вызов метода @Cacheable из метода @Cacheput не работает - PullRequest
0 голосов
/ 13 апреля 2020

Если я позвоню прямо на @Cacheable (findById), это работает хорошо. Но если я вызываю метод @Cacheput, он не работает.

    @Cacheable(key = "#p0")
    public User findById(String userId) {
        User user = userRepository.findById(userId).orElseThrow(() -> new NotFoundException());
        return user;
    }
    @CachePut(key = "#p0")
    public User disabled(String userId) {
        User user = findById(userId);
        user.setStatus(0);
        userRepository.save(user);
        return user;
    }

1 Ответ

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

«Не работает» немного абстрактно, поэтому я предполагаю, что вы имеете в виду «кэширование не работает, и метод вызывается каждый раз».

То есть точно разница между ними:

  • @ Cacheable : метод будет вызван только один раз, а результат будет помещен в кэш.
  • @ CachePut : кэш будет обновляться, но метод будет вызываться каждый раз!

Из документов:

В отличие от аннотация @Cacheable, эта аннотация (@CachePut) не приводит к пропуску рекомендованного метода. Скорее, он всегда вызывает метод, который вызывается, и его результат сохраняется в соответствующем кэше. Обратите внимание, что дополнительные типы возвращаемых данных Java8 обрабатываются автоматически, а их содержимое сохраняется в кеше, если таковой имеется.

From: https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/cache/annotation/CachePut.html

Для добавления в проблема, если вы вызываете другой метод внутри себя (вы вызываете @Cachable из @Cacheput), аннотация не будет работать, потому что аннотации в Spring обычно работают только тогда, когда вы вызываете метод публично (как, например, снаружи вашего класса). Вызов метода из одного и того же класса не дает среде Spring возможности проникнуть между вашим кодом и сделать его волшебным c.

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