带有自定义cacheResolver的spring缓存

2023-12-25

我想要动态缓存名称和 spring4.1 允许 http://docs.spring.io/spring/docs/current/spring-framework-reference/html/cache.html

从 Spring 4.1 开始,缓存注释的 value 属性不再是强制性的,因为无论注释的内容如何,​​CacheResolver 都可以提供此特定信息。

请注意我是如何偏执地设置的cacheResolver在所有可能的层面上:

@Cacheable(cacheResolver = "defaultCacheResolver")
@CacheConfig(cacheResolver = "defaultCacheResolver")
public interface GatewayRepository extends CrudRepository<Gateway, Integer> {
    @Cacheable(cacheResolver = "defaultCacheResolver")
    Gateway findByBulkId(int bulkId);
}

Spring 4.1.5 仍然无法验证配置并出现错误:Caused by: java.lang.IllegalStateException: No cache names could be detected on 'public abstract skunkworks.data.Gateway skunkworks.repos.GatewayRepository.findByBulkId(int)'. Make sure to set the value parameter on the annotation or declare a @CacheConfig at the class-level with the default cache name(s) to use. at org.springframework.cache.annotation.SpringCacheAnnotationParser.validateCacheOperation(SpringCacheAnnotationParser.java:240)


我认为你应该在代码中的某处指定缓存名称。

在基本用法中,缓存名称在 @Cacheable、@CachePut 或 @CacheEvict 注释中给出。

@Cacheable(cacheNames = "myCache")

您还可以在 @CacheConfig 中指定它,这是一个类级注释。

@CacheConfig(cacheNames = "myCache")

如果需要更灵活的缓存机制,可以使用CacheResolver。在这种情况下,您应该创建自己的 CacheResolver。沿着这些思路:

public class CustomCacheResolver implements CacheResolver {

    private final CacheManager cacheManager;

    public CustomCacheResolver(CacheManager cacheManager){
        this.cacheManager = cacheManager;
    }

    @Override
    public Collection<? extends Cache> resolveCaches(CacheOperationInvocationContext<?> context) {
        Collection<Cache> caches = new ArrayList<>();
        if(context.getTarget().getClass() == GatewayRepository.class){
            if(context.getMethod().getName().equals("findByBulkId")){
                caches.add(cacheManager.getCache("gatewayCache"));
            }
        }

        return caches;
    }
}

本步骤中缓存名称为

网关缓存

它仅在缓存解析器中定义,并且可以在注释端省略。

完成此步骤后,您应该注册 CacheResolver:

@Configuration
@EnableCaching
public class CacheConfiguration extends CachingConfigurerSupport {

    @Bean
    @Override
    public CacheManager cacheManager() {
         // Desired CacheManager
    }

    @Bean
    @Override
    public CacheResolver cacheResolver() {
        return new CustomCacheResolver(cacheManager());
    }
}

作为最后一步,您应该在 @Cacheable、@CachePut、@CacheConfig 等注释之一中指定 CustomCacheResolver。

@Cacheable(cacheResolver="cacheResolver")

你可以看here https://github.com/isaolmez/spring-cache-samples对于代码示例

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带有自定义cacheResolver的spring缓存 的相关文章

随机推荐

  • Javascript 中的任务运行器

    我有一个任务列表 只有在解决每个任务的所有依赖关系后才需要执行所有这些任务 我正在努力找出一种方法来在最佳时间完成所有任务 Each node is a async job illustrated by setTimeout A and C
  • 在 Windows 环境中使用 C++ 进行 GUI 开发 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 首先请大家理解 我搜索了这个并搞乱了几个星期 我终于放弃了单独的努力 并决定向这个可爱的社区寻求帮助
  • 用于循环赛的Python程序

    我正在编写一个程序 允许用户输入甚至数量的玩家 然后它将生成循环赛时间表 n 2 n 1游戏数量 以便每个玩家都与其他玩家进行比赛 现在我很难生成用户输入的玩家数量列表 我收到此错误 类型错误 int 对象不可迭代 我在我的程序中经常遇到这
  • 使用图像进行相似图像搜索

    我正在开发一个项目 其中将检查两个图像的相似性 例如 Google Image Search by image 我通过 Google 以及包括 stackoverflow 在内的各种网站进行了搜索 并了解了各种技术 例如直方图 筛选 傅里叶
  • Android 工作室:java.lang.NoClassDefFoundError

    我已将我的项目从 Eclipse 导入到 Android Studio 并且它在 Lollipop 设备上运行 如果我在 kitkat 设备上运行 它会给我 未找到类定义 异常 在我的项目中我有两个包1 com qapp它具有核心功能类和2
  • 来自解构函数的调试断言失败 BLOCK_TYPE_IS_VALID(pHead->nblockuse)

    我现在很迷失 我做了一个向量类 一切都按照我希望的方式进行 直到最后 调用析构函数时 我收到一条错误消息 调试断言失败 BLOCK TYPE IS VALID pHead gt nblockuse 我在 SO 上看到过很多像这样的问题 但我
  • SQL Server T-SQL 中的整数最大值常量?

    T SQL 中是否有像其他语言中的常量一样提供数据类型 例如 int 的最大值和最小值范围 我有一个代码表 其中每一行都有一个上限和下限列 我需要一个条目来表示一个范围 其中上限是 int 可以容纳的最大值 有点像黑客无穷大 我不想对其进行
  • 通过 Javascript 缓存与在服务器中设置 HTTPResponse 标头有什么区别

    在前端 我使用 AngularJS resource 进行 GET 请求 在后端 我使用 SpringMVC 以 Restful 方式公开我的方法 现在我想缓存只有一些 of my GET要求 我注意到有一些方法可以做到这一点 例如使用 c
  • 如何以编程方式填充使用 React 构建的输入元素?

    我的任务是抓取用 React 构建的网站 我正在尝试填写输入字段并使用 javascript 注入到页面 移动设备中的 selenium 或 webview 提交表单 这对其他所有网站 技术来说都是一种魅力 但 React 似乎是一个真正的
  • 从 Web 应用程序中删除经过 Firebase 身份验证的用户

    我想添加选项以从我的 Web 应用程序中从经过 Firebase 身份验证的用户列表中删除用户 我使用的身份验证方法是电子邮件和密码身份验证 该应用程序是移动单页应用程序 基于js html css 文件 浏览器应用程序 我可以使用 fir
  • LINQ TO Nhibernate 计数

    我正在尝试使用 LINQ to Nhibernate 来获取数据库中表的计数 但是 我正在运行的代码是拉回表中的所有记录 而不是从表中运行 select count 这是我的代码 public int GetTotalCount Func
  • 我需要将 strtol 的结果转换为 int 吗?

    以下代码不会对 g 4 1 1 发出警告 并且 Wall int octalStrToInt const std string s return strtol s c str 0 8 我期待一个警告 因为 strtol 返回一个long i
  • LINQ 表达式树是真正的树吗?

    LINQ 表达式树是否是正确的树 如图中所示 有向或无向 维基百科似乎不太同意 而没有循环 以下 C 表达式的表达式树的根是什么 string s gt s Length 表达式树如下所示 其中 gt 表示可访问其他节点的节点的属性名称 g
  • ngOninit 变量未在 html Angular 4 中绑定

    在谷歌地图上工作 能够显示地图 我想显示当前位置但不显示 export class AppComponent title ngOnInit if navigator geolocation navigator geolocation get
  • Xml 中的非法字符

    我有一个 PHP 文件 它根据从多个来源导入的数据生成 Xml 站点地图 由于导入数据的一行中存在非法字符 我的站点地图目前格式不正确 但我正在努力将其删除 该字符看起来代表 平方 或上标 2 并且被表示为正方形 我尝试将其粘贴到十六进制编
  • Glide - 如何并行加载多个图像?

    我正在尝试一个简单的测试 MainActivity java public class MainActivity extends AppCompatActivity private static final int N 20 private
  • numeric_limits::digits10 的含义是什么

    numeric limits digits10 的确切含义是什么 stackoverflow中的一些其他相关问题让我认为这是双精度的最大精度 但是 当精度大于 17 2 numeric limits digits10 时 以下原型开始工作
  • 向某些用户显示管理消息的最佳方式?

    我正在用 PHP MySQL jQuery 构建一个社交网站 用户登录我的网站后 我想查询数据库并获取管理员公告 如果存在 这将是一个消息框 在页面上向所有用户显示 但它会有一个X单击它并且不再显示它 直到管理员发布新的公告消息 因此 如果
  • 等到线程执行结束后再执行下一个方法

    我有一个 JFrame 子类 它管理我的 UI 并调用 Item 对象的方法来导入数据库中的项目 public TestGUI throws IOException initComponents Item importItems progr
  • 带有自定义cacheResolver的spring缓存

    我想要动态缓存名称和 spring4 1 允许 http docs spring io spring docs current spring framework reference html cache html 从 Spring 4 1