У меня есть 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) с помощью набора параметров запроса и заголовков.
Я знаю, что могу добавить Cacheable в методы ресурсов и использовать KeyGenerator для создания ключей кэширования на основе заголовка accept-language
, возможно, типа носителя, и любые другие параметры, которые я хочу.
Однако это будет кешировать объекты, а не визуализированный json (или XML).
Я прочитал документацию по кешированию статических активов , но это только настройка заголовков управления кэшем.
Я хочу избежать сериализации этих объектов, если они уже кэшированы.
Я мог бы изменить методы ресурса, чтобы он возвращал ResponseEntity<String>
, и обрабатывать рендеринг самостоятельно, но мне пришлось бы менять код в каждом методе ресурса для каждого нового типа носителя, который мы хотим поддерживать.
Я думал об использовании HandlerInterceptor , но он имеет дело с ответом перед его обработкой.
Я думаю, что могу использовать пользовательский CacheProvider
, но кажется, что это может быть много работы.