我有一个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)。
我读过documentation on caching static assets,但这些只是设置缓存控制头。
我想避免这些对象的序列化,如果它已经被缓存。
我可以更改资源方法以返回ResponseEntity<String>
并自己处理渲染,但我必须为每个我们想要支持的新媒体类型更改每种资源方法中的代码。
我曾考虑使用HandlerInterceptor,但它会在渲染之前处理响应。
我想我可以使用自定义CacheProvider
,但这似乎可能是很多工作。
您可以使用Filter
。那些可以读取渲染的输出流,也可以写入它。如果你使用委托过滤器代理进行设置,那么它也可以达到像@Cacheable
这样的spring服务和注释。
您也可以利用您提到的那些缓存控制头。在这种情况下,消费者将知道这些XML有效多长时间。无论如何,有更好的解决方案来缓存像Varnish这样的信息。