2015-10-28 1 views
7

Я хочу иметь @Cacheable аннотация по методу без параметров. В этом случае я использую @Cacheable следующий@ Качательная аннотация без параметров

@Cacheable(value="usercache", key = "mykey") 
public string sayHello(){ 
    return "test" 
} 

Однако, когда я называю этот метод, он не получает казнен и получить исключение, как показано ниже

org.springframework.expression.spel .SpelEvaluationException: EL1008E: (pos 0): свойство или поле 'mykey' не могут быть найдены на объекте типа 'org.springframework.cache.interceptor.CacheExpressionRootObject' - возможно, не публично?

Просьба предложить.

ответ

16

Похоже, что Spring не позволяет предоставить статический текст для ключа кэша в SPEL, и он не включает по умолчанию имя метода на ключ, поэтому вы можете быть в ситуация, когда два метода с использованием одного и того же cacheName и без ключа потенциально кэшируют разные результаты одним и тем же ключом.

Самый простой обходной путь, чтобы обеспечить имя метода в качестве ключа:

@Cacheable(value="usercache", key = "#root.methodName") 
public string sayHello(){ 
return "test" 
} 

Это набор sayHello в качестве ключа.

Если вам действительно нужен статический ключ, вы должны определить статическую переменную в классе, а также использовать #root.target:

public static final String MY_KEY = "mykey"; 

@Cacheable(value="usercache", key = "#root.target.MY_KEY") 
public string sayHello(){ 
return "test" 
} 

Вы можете найти here список SPEL выражений, которые вы можете использовать в вашем ключе.

+0

Можете ли вы объяснить эту линию - статический ключ (MyKey в вашем случае) также не имеет смысла, так как весна уже связывает кэш для конкретного метода , так что будет ключ, который будет храниться в кеше, если я не буду упоминать его явно – user3534483

+0

@ user3534483 извините, я ошибался в отношении ключа по умолчанию, который использует Spring. Я отредактировал ответ и добавил правильную информацию. – Ruben

+0

Спасибо ... это сработало – user3534483

3

Попробуйте добавить одиночные котировки вокруг mykey. Это выражение SPEL, а синглы - снова String.

@Cacheable(value="usercache", key = "'mykey'") 
0

Добавить # в ключе

@Cacheable(value="usercache", key = "#mykey") 
public string sayHello(){ 
    return "test" 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^