Spring Caching - игнорировать параметр для ключа
Я хочу кешировать результаты простого геттера, который имеет необязательный параметр (user-agent в примере ниже). Как я могу дать указание создать ключ без учета необязательного параметра user-agent?
@Cacheable(value="bookCache")
public Book getBooks(@RequestHeader(value = "user-agent", required = false) String userAgent)
...
2 ответа
Можно настроить способ создания ключа для определенного объекта кэша, предоставив пользовательский KeyGenerator
,
Вот как это может выглядеть:
@Service
class BookService {
@Cacheable(cacheNames = "books", keyGenerator = "customKeyGenerator")
public List<Book> getBooks(String someParam) {
//....
}
}
@Component
class CustomKeyGenerator implements KeyGenerator {
@Override
public Object generate(Object target, Method method, Object... params) {
// ... return a custom key
}
}
Пользовательский ключ с использованием SpEL
Как сказал Игорь, вам может не понадобиться пользовательская реализация keyGenerator - вы можете либо создать фиксированный ключ (см. Его ответ), либо использовать SpEL
создать собственный ключ кеша. В следующем примере он использует первый метод-аргумент в качестве ключа (см. @Cacheable#key
для деталей):
@Service
class BookService {
@Cacheable(cacheNames = "books", key = "#root.args[0]")
public List<Book> getBooks(String requiredParam, String optionalParam) {
//....
}
}
Возможно, вам не нужно реализовывать пользовательские KeyGenerator
просто игнорировать необязательный параметр метода userAgent. Что вы можете сделать, это просто определить свой ключевой атрибут с некоторым строковым значением, например, "books":
@Cacheable(value="bookCache", key = "'books'")
public Book getBooks(@RequestHeader(value = "user-agent", required = false) String userAgent) {
// ...
}
Тогда ваши значения будут кэшироваться в области кэша bookCache, под ключом "books".