【问题标题】:What is the best way of defining key for @Cacheable annotation for Spring为 Spring 的 @Cacheable 注释定义键的最佳方法是什么
【发布时间】:2014-09-25 12:55:24
【问题描述】:

如果我为没有任何参数的方法定义 ehcache。

但在我的用例中,我需要通过它的键来访问我构建的缓存。

所以请为我提供更好的分配密钥的方法。

以下是我的代码:

@Override
@Cacheable(value = "cacheName", key = "cacheKey")
public List<String> getCacheMethod() throws Exception{

附:当我尝试从其他地方访问此方法时出现以下错误。

org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): 在“org.springframework.cache.interceptor.CacheExpressionRootObject”类型的对象上找不到字段或属性“cacheKey”

【问题讨论】:

  • 好吧,你的方法签名中没有参数,所以即使key="cacheKey" 一个有效的SpEL(it isn't)它也不会工作,因为没有这样的范围。很难说出您希望实现的目标,因为 @Cacheable 不是这样工作的 - 它确实需要方法参数用作键,否则缓存将具有一个项目的容量。
  • 您使用@Cacheable 注释是绝对正确的,当我尝试以编程方式访问缓存时,它会返回正确的对象,并且如果我尝试从同一个类访问它工作正常,但是当我尝试要从另一个类访问该方法,它会抛出错误“EL1008E:(pos 0): Field or property 'cacheKey' cannot be found on object of type 'org.springframework.cache.interceptor.CacheExpressionRootObject'”
  • 不清楚你在问什么(你问题的方向好像换了三遍),听起来可能和这个问题有关→stackoverflow.com/q/12115996/1240557
  • Kryger 你几乎明白了我的要求,我已经通过以编程方式访问缓存解决了代理问题 Cache cache = cacheManager.getCache("cacheName"); if (cache.get("cacheKey") != null) { return (List) cache.get("cacheKey").get();并且它在同一个类中工作正常,但是当它访问来自不同类的缓存方法时,它会抛出 spring spel 异常
  • 您是否尝试过从注释配置中删除key?根据我的第一条评论,它不正确的原因不止一个。但是,尚不清楚您在上面的评论中包含的 sn-p 中的 "cacheKey" 字符串的含义是什么,以及您希望它如何与 @Cacheable 注释相关联。您确定您阅读了文档吗?

标签: java spring ehcache spelevaluationexception


【解决方案1】:

该方法没有参数,因此无法使用参数/参数作为默认键,并且您不能使用“静态文本”作为键,您可以执行以下操作:

声明如下

public static final String KEY = "cacheKey";
  • 必须是public
  • 必须是staticfinal

然后

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

完成

【讨论】:

  • 向可缓存注释添加键有什么影响?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    请看一下这个spring doc

    key 指的是你的方法的参数,你有SpelEvaluationException 因为cachekey 不在你的方法参数中。

    【讨论】:

    • ShadowRay 我想在没有参数的情况下创建一个密钥,我们可以这样做吗?或者不
    【解决方案4】:

    您可以在键中使用单引号将其再次变为字符串来解决此问题。

    @Cacheable(value= CACHE_NAME.PRODUCT_CATLOG, key=" 'products' ")
        public List<Product> findAll() {
            return StreamSupport.stream(productRepository.findAll().spliterator(),false).collect(Collectors.toList());
        }
    

    【讨论】:

      猜你喜欢
      • 2013-06-26
      • 2012-07-08
      • 1970-01-01
      • 1970-01-01
      • 2019-01-30
      • 2013-10-18
      • 2014-01-29
      • 2015-12-11
      • 2012-08-01
      相关资源
      最近更新 更多