Spring Cache обновляет кэшированное значение при изменении в службе - PullRequest
0 голосов
/ 28 марта 2020

У меня есть кэшированный метод репозитория, который возвращает макросы. Я использую этот репозиторий в службе, чтобы получить макросы и заменить ключ {имя пользователя} именем текущего пользователя.

Например, скажем, у меня есть макрос, сохраненный как Hi, {username}. Когда пользователь Foo входит в систему, служба заменяет макрос на Hi, Foo.

. Проблема, с которой я сталкиваюсь, заключается в том, что значение кэша обновляется с помощью замененного макроса. Поэтому пользователь Bar видит Hi, Foo вместо Hi, Bar, потому что ключ {username} пропал.

Я не хочу заменять значение кэша, когда служба изменяет макрос. Я предложил следующие решения:

  • создайте класс MacroWrapper и используйте @Query("select new MacroWrapper(m) from Macro m where m.type = ?1");
  • , чтобы клонировать список макросов перед заменой имени пользователя.

Но мне было интересно, есть ли более простой подход?

Репозиторий:

@Repository
@CacheConfig(cacheNames = "macros")
public interface MacroRepository extends JpaRepository<Macro, Long> {
  @Cacheable
  List<Macro> findByType(MacroType type);

  @CacheEvict(value = "macros", allEntries = true)
  <S extends Macro> save(S macro);
}

Служба

@Service
public MacroService {
  @Autowired
  private MacroRepository repository;

  public List<Macro> getMacros(MacroType type, String username) {
    return repository.findByType(type).stream()
        .map(macro -> macro.setRemark(text.replace("{username}", username)))
        .collect(Collectors.toList());
  }
}
...