我有一个缓存的存储库方法,该方法返回宏。我在服务中使用该存储库,以获取宏并将键{username}替换为当前用户的名称。
例如,假设我有一个另存为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());
}
}