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".

Другие вопросы по тегам