2015-10-28 22 views
7

Chcę mieć adnotację @Cacheable dla metody bez parametru. W takim przypadku, używam @Cacheable następująco@Akumulator adnotacji w metodzie bez parametru

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

Jednak, kiedy wywołanie tej metody, to nie zostanie wykonane i to się wyjątek jak poniżej

org.springframework.expression.spel .SpelEvaluationException: EL1008E: (pos 0): Właściwość lub pole "mykey" nie można znaleźć na obiekcie typu "org.springframework.cache.interceptor.CacheExpressionRootObject" - może nie jest publiczne?

Proszę sugerować.

Odpowiedz

16

Wygląda na to, że Spring nie zezwala na dostarczanie statycznego tekstu dla klucza pamięci podręcznej w SPEL, i nie zawiera domyślnie nazwy metody na kluczu, więc możesz być w sytuacja, gdy dwie metody używające tego samego cacheName i bez klucza potencjalnie buforują różne wyniki za pomocą tego samego klucza.

Najprostszym rozwiązaniem jest podać nazwę metody jako klucza:

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

by ten zestaw sayHello jako klucz.

Jeśli naprawdę potrzebujesz klucza statyczną, należy zdefiniować zmienną statyczną w klasie i używać #root.target:

public static final String MY_KEY = "mykey"; 

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

można znaleźć here lista Spel wyrażeń, które można wykorzystać w swoim kluczem.

+0

Czy możesz wyjaśnić tę linię - klucz statyczny (MyKey w danym przypadku) nie byłoby również sensu, jak Wiosna już wiąże Cache do konkretnej metody . więc jaki byłby klucz, który będzie przechowywany w pamięci podręcznej, jeśli nie będę go wyraźnie wymawiać – user3534483

+0

@ user3534483 Przepraszam, myliłem się co do klucza domyślnego używanego przez Spring. Edytowałem odpowiedź i dodałem właściwe informacje. – Ruben

+0

Dzięki ... zadziałało – user3534483

3

Spróbuj dodać pojedyncze cudzysłowy wokół numeru mykey. To wyrażenie SPEL, a cytaty singla sprawiają, że ponownie jest to String.

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

Dodaj # w kluczowej

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