为Spring定义@Cacheable注释的键的最佳方法是什么?

时间:2014-08-02 12:42:53

标签: java spring ehcache spelevaluationexception

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

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

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

关注我的代码:

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

P.S。当我尝试从其他地方访问此方法时,我收到以下错误。

  

org.springframework.expression.spel.SpelEvaluationException:   EL1008E:(pos 0):字段或属性&#39; cacheKey&#39;无法在类型对象上找到org.springframework.cache.interceptor.CacheExpressionRootObject&#39;

4 个答案:

答案 0 :(得分:13)

该方法没有参数,因此没有办法将参数/参数用作默认密钥,并且您不能使用&#34;静态文本&#34;作为密钥,您可以执行以下操作:

声明以下内容

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

然后

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

完成

答案 1 :(得分:2)

请查看此spring doc

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您可以使用密钥中的单引号将其重新设置为String来解决此问题。

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