如何定义Spring中@Cacheable注解的键(key)最佳方式?

9
如果我为一个没有任何参数的方法定义了一个ehcache。
但在我的使用情况下,我需要通过它的键访问我的构建缓存。
因此,请提供更好的分配键的方法。
以下是我的代码:
@Override
@Cacheable(value = "cacheName", key = "cacheKey")
public List<String> getCacheMethod() throws Exception{

备注:我在尝试从其他地方访问此方法时遇到了以下错误。

org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): 在'type'为'org.springframework.cache.interceptor.CacheExpressionRootObject'的对象上找不到'cacheKey'字段或属性。


3
您的方法签名中没有参数,因此即使 key="cacheKey" 是有效的 SpEL(它不是),也无法工作,因为没有这样的参数。很难说出您希望实现什么,因为这不是 @Cacheable 的工作方式 - 它需要方法参数用作键,否则缓存将只有一个项目的容量。 - kryger
你对@Cacheable注解的理解是完全正确的。当我尝试以编程方式访问缓存时,它返回了正确的对象。如果我在同一个类中尝试访问,它也能正常工作。但是,当我尝试从另一个类中访问该方法时,它会抛出错误"EL1008E:(pos 0): Field or property 'cacheKey' cannot be found on object of type 'org.springframework.cache.interceptor.CacheExpressionRootObject'"。 - BITSSANDESH
不太清楚你的问题是什么(你好像已经三次改变了问题的方向),听起来可能与这个问题有关→https://dev59.com/2Wct5IYBdhLWcg3wZcqL? - kryger
Kryger,你差不多明白我在问什么了,我已经通过编程方式访问缓存来解决代理问题。Cache cache = cacheManager.getCache("cacheName"); 如果(cache.get("cacheKey") != null) { return (List<String>) cache.get("cacheKey").get(); } 在同一个类中它可以正常工作,但是当从不同的类中访问缓存方法时,它会抛出Spring SpEL异常。 - BITSSANDESH
你尝试过从注解配置中删除“key”吗?正如我在第一条评论中所述,它有多个错误。但是,在您上面的评论中包含的代码片段中,“cacheKey”字符串的含义以及您希望它与@Cacheable注解相关联的方式并不清楚。您确定已经阅读了文档吗? - kryger
kryger,我认为你可能是正确的,但是像我之前评论中提到的,我必须从缓存对象中访问缓存的List<String>,所以我正在尝试获取没有键的缓存对象,但是我只得到了null。 - BITSSANDESH
4个回答

24
该方法没有参数,因此没有办法将参数/参数作为默认键使用,并且无法使用"静态文本"作为键,您可以执行以下操作:
声明如下内容:
public static final String KEY = "cacheKey";
  • 必须是public
  • 必须是staticfinal

接下来

@Override
@Cacheable(value = "cacheName", key = "#root.target.KEY")
public List<String> getCacheMethod() throws Exception{

完成


将key添加到可缓存注释中会有什么影响? - StackOverFlow

7
在简单情况下,您可以使用一种更简单的方法:@Cacheable(key = "#root.methodName"),并且关键字将等于带注释方法的名称。

4
你可以使用在键名中添加单引号的方式,将其再次转换为字符串来解决这个问题。
@Cacheable(value= CACHE_NAME.PRODUCT_CATLOG, key=" 'products' ")
    public List<Product> findAll() {
        return StreamSupport.stream(productRepository.findAll().spliterator(),false).collect(Collectors.toList());
    }

2
请查看此Spring文档
“key”指的是您方法的参数,您遇到了“SpelEvaluationException”的问题,因为“cachekey”不在您的方法参数中。

1
ShadowRay,我想在没有参数的情况下创建一个密钥,我们能做到吗?还是不行? - BITSSANDESH

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接