У меня есть кэшированный метод репозитория, который возвращает макросы. Я использую этот репозиторий в службе, чтобы получить макросы и заменить ключ {имя пользователя} именем текущего пользователя.
Например, скажем, у меня есть макрос, сохраненный как 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());
}
}