【问题标题】:ETag support in Spring for versioned entitySpring 中对版本化实体的 ETag 支持
【发布时间】:2013-09-06 05:03:27
【问题描述】:
我计划为我的 RESTfull Spring 应用程序支持 ETag。我公开的大部分资源都在 DB 中进行了版本控制。
我知道 ShallowEtagHeaderFilter,这并不完全是我所需要的,因为它只会节省带宽。
是否有针对 Spring MVC 的生产就绪解决方案,将 ETag 标头与公开的实体版本相关联?
【问题讨论】:
标签:
java
spring
rest
spring-mvc
http-headers
【解决方案1】:
spring-data-rest 支持这个开箱即用,请参阅the conditional request part of the reference documentation。
您还可以使用 Spring Framework 4.2.0+,它支持对控制器方法返回的 ResponseEntity 类型的条件请求 - see reference documentation。
类似:
@RequestMapping("/book/{id}")
public ResponseEntity<Book> showBook(@PathVariable Long id) {
Book book = findBook(id);
String version = book.getVersion();
return ResponseEntity
.ok()
.cacheControl(CacheControl.maxAge(30, TimeUnit.DAYS))
.eTag(version) // lastModified is also available
.body(book);
}
【解决方案2】:
您可以使用ServletWebRequest.checkNotModified 调用来检查自定义电子标签,在您的情况下,电子标签就是版本号。同样,这仅在您的内容更改保证版本号更改时才有效。
更多详情here.