ETag是HTTP等效
@Value于后端中表示为属性的内容。Spring Data REST将所有在HTTP协议中具有相应机制的与后端相关的属性完全转换为:ID成为URI(也不应该是有效负载的一部分),
@LastModifiedDate属性成为标头,
@Version属性,成为ETag。
原因很简单:如果使用HTTP,则使用协议手段可用于实现在数据访问级别上实现的功能。这是Spring Data REST 不仅将数据库公开到Web而是实际上检查模型并将模型特征转换为协议特定手段的一个方面。
长话短说:使用Spring Data REST,你有两个更新选项:
- 只是
PUT
没有If-Match
头-强制覆盖服务器上存在的所有内容,因为要加载聚合,将传入的数据映射到该数据并将其写回。如果其他客户端同时更改了聚合,你仍然会获得乐观锁定(尽管窗口很短)。如果是这种情况,你会看到一个409 Conflict
。 PUT
带有If-Match标头-Spring Data REST
根据聚合的version属性的当前值检查提交的ETag并返回412 Precondition Failed
,以防万一此时不匹配。在这种情况下,客户端可以查找资源的当前状态并决定如何进行。他们可能只是决定PUT不使用If-Match标头来覆盖服务器上使用的内容。
可以对GET请求进行类似的优化:GETwith If-None-Match(ETag)/ If-Modified-Since
(带有Last-Modified标头值)—如果304 Not Modified
资源仍与以前一样,你将看到一个,因此避免了为响应花费带宽。- Plain
GET
将始终返回该表示形式。



