У меня есть RestController, возвращающий некоторые локализованные объекты, такие как названия книг и описания, переведенные на запрошенный пользователем язык.
@RestController
public class BooksResource {
@Autowired
private BookService bookService;
@GetMapping("/books")
public List<Book> findBooks(
@RequestParam(required = false) Boolean active,
@RequestHeader(value = "accept-language", defaultValue = "*") String acceptedLanguages) {
return bookService.findAll(active, acceptedLanguages);
}
@GetMapping("/books/{bookId}")
public Book findBook(
@PathVariable String bookId,
@RequestHeader(value = "accept-language", defaultValue = "*") String acceptedLanguages) {
return bookService.findById(bookId, acceptedLanguages);
}
}
У меня много разных клиентов, делающих один и тот же запрос, но каждый клиент не часто делает повторяющиеся запросы.
Я ищу способ кэшировать локализованные ответы (полностью вычисленные/отображаемые json) с помощью набора параметров запроса и заголовков.
Я знаю, что могу добавить использование Кэшируемый к методам ресурсов и использовать Генератор ключей для создания ключей кеша из заголовка accept-language, возможно, медиа-типа и любых других параметров, которые я хочу.
Однако это будет кэшировать объекты, а не отображаемый json (или XML).
Я прочитал документация по кэшированию статических ресурсов, но это просто установка заголовков управления кешем.
Я хочу избежать сериализации этих объектов, если они уже кэшированы.
Я мог бы изменить методы ресурса, чтобы он возвращал ResponseEntity<String> и сам обрабатывал рендеринг, но мне пришлось бы изменить код в каждом методе ресурса для каждого нового типа мультимедиа, который мы хотим поддерживать.
Я думал об использовании ОбработчикПерехватчик, но он обрабатывает ответ до его рендеринга.
Я думаю, что могу использовать пользовательский CacheProvider, но, похоже, это может потребовать много работы.
Вы можете использовать Filter для этого. Они могли читать визуализированный поток вывода, а также могли записывать в него. Если вы настроите его с помощью прокси-сервера с делегирующим фильтром, он также может получить доступ к службам Spring и подобным аннотациям @Cacheable.
Вы также можете воспользоваться преимуществами использования упомянутых вами заголовков управления кешем. В этом случае сторона потребителя будет знать, как долго эти XML действительны. В любом случае, есть гораздо лучшие решения для кэширования такого рода информации, такие как Varnish.
Да, делегирующий прокси-фильтр сработает. Лак был бы лучше, но это не наш вариант. Спасибо! Очень надеялся, что есть более простой способ.