java - 当参数值为空时如何在@Cacheable中创建多个缓存键

标签 java spring-boot caching ehcache-3

我正在尝试创建具有多个参数值的缓存键。

@Cacheable(cacheNames = "cache_name_", key = "#name + '_' + #id")
private JSONObject getData(String name, String id) throws Exception {

从上面的场景来看,I name 是必填字段,而 id 是可选字段。我想以这样的方式创建 key ,

  1. 如果 name = "test"且 id = null,则缓存键必须为cache_name_test
  2. 如果 name = "test"且 id = "2",则缓存键必须为cache_name_test_2

目前,如果参数值中未传递 id,则键会形成类似“cache_name_test_null”的内容

是否可以使用@Cacheable注释创建这样的 key ?

最佳答案

解决方案

这是可行的,但您需要将 2 个 @Cachable 注释包装在 @Caching 注释中。

@Caching(
      cacheable = {
            @Cacheable(cacheNames = "cache_name_", key = "#name + '_' + #id", condition = "#id != null"),
            @Cacheable(cacheNames = "cache_name_", key = "#name", condition = "#id == null")
      }
    )
public JSONObject getData(String name, String id) throws Exception {

私有(private)方法注意事项

您正在私有(private)方法上使用@Caching 注释。这是行不通的。这些注释仅适用于从类外部调用的公共(public)方法。请参阅 Stack Overflow 答案:https://stackoverflow.com/a/16899739/2082699

关于java - 当参数值为空时如何在@Cacheable中创建多个缓存键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61284393/

相关文章:

java - Hibernate 抛出 SQLException "id field does not have a default value"

java - 在 Spring Boot 中读取 MacOs 环境变量

javascript - 出现在谷歌搜索结果页面中的原始 AngularJs 标记

java - Bean单例、 session 创建和初始化

java - Spring 启动测试 : @Sql annotation Unable to locate sql files placed in src/test/resources

c++ - 优化数据结构,以便它们利用虚拟内存

asp.net-mvc - session 超时在 Azure Redis 缓存 session 状态提供程序中不会滑动

java - Qt Jambi 与 SWT 的跨平台 GUI 开发

java - 权限被拒绝通过Hadoop Java API访问HDFS

java - Spring Data JPA 方法 + REST : Enum to Integer conversion