You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@CacheResult时如何对参数调用静态方法?

解决@CacheResult中调用静态方法生成缓存Key的问题

你完全可以在@CacheResult注解中通过key属性使用SpEL表达式来调用静态方法,和@Cacheable的写法几乎一致——因为Spring Cache对这两个注解的SpEL支持是同源的。

具体实现方式

直接在@CacheResult的key参数里编写包含静态方法调用的SpEL表达式即可,语法和你用@Cacheable时完全一样:

@CacheResult(cacheName = "myCache", key = "{#id, #name, T(my.static).method(#date)}")
public Result search(long id, String name, Date date);

原理说明

Spring Cache的注解(包括@CacheResult和@Cacheable)都支持通过SpEL表达式来定义缓存Key。其中:

  • T()语法用于引用静态类,建议使用完整类路径避免运行时解析歧义
  • #参数名用于直接引用方法的入参
  • 你可以像在@Cacheable里一样,组合多个参数、调用静态方法甚至执行更复杂的逻辑来生成Key

进阶方案:自定义KeyGenerator

如果你的Key生成逻辑比较复杂,或者需要在多个方法中复用,也可以自定义KeyGenerator,然后在@CacheResult的keyGenerator属性中指定:

// 自定义KeyGenerator组件
@Component("customSearchKeyGenerator")
public class CustomSearchKeyGenerator implements KeyGenerator {
    @Override
    public Object generate(Object target, Method method, Object... params) {
        long id = (long) params[0];
        String name = (String) params[1];
        Date date = (Date) params[2];
        // 调用静态方法处理date参数
        Object processedDate = MyStaticClass.method(date);
        // 返回组合后的Key
        return Arrays.asList(id, name, processedDate);
    }
}

// 使用自定义KeyGenerator的@CacheResult
@CacheResult(cacheName = "myCache", keyGenerator = "customSearchKeyGenerator")
public Result search(long id, String name, Date date);

这样两种方式都能实现你想要的效果,简单逻辑用SpEL直接写在注解里更直观,复杂逻辑用自定义KeyGenerator更利于维护和复用。

内容的提问来源于stack exchange,提问作者Younes HAJJI

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:48:08