打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
使用Spring Data REST,为什么@Version属性成为ETag并且不包含在表示中?

Spring Data REST(通过Spring Boot 1.3.3)中,当我获取人员的资源集合时,@ Version属性不包含在资源中:

$curl -v http://localhost:8080/api/people/1*   Trying ::1...* Connected to localhost (::1) port 8080 (#0)> GET /api/people/1 HTTP/1.1> Host: localhost:8080> User-Agent: curl/7.42.1> Accept: */*> < HTTP/1.1 200 OK< Server: Apache-Coyote/1.1< ETag: "0"< Last-Modified: Tue, 26 Apr 2016 00:08:12 GMT< Content-Type: application/hal json;charset=UTF-8< Transfer-Encoding: chunked< Date: Tue, 26 Apr 2016 00:12:56 GMT< {  "id" : 1,  "createdDate" : {    "nano" : 351000000,    "epochSecond" : 1461629292  },  "lastModifiedDate" : {    "nano" : 351000000,    "epochSecond" : 1461629292  },  "firstName" : "Bilbo",  "lastName" : "Baggins",  "_links" : {    "self" : {      "href" : "http://localhost:8080/api/people/1"    },    "person" : {      "href" : "http://localhost:8080/api/people/1"    }  }* Connection #0 to host localhost left intact

默认情况下,或者在配置Spring Data存储库时:

@Configurationpublic class ApplicationRepositoryConfiguration     extends RepositoryRestMvcConfiguration {        @Override    protected void configureRepositoryRestConfiguration(        RepositoryRestConfiguration config        )     {        config.exposeIdsFor(Person.class);        config.setBasePath("/api/");    }}

@Version是数据行的版本,在更新时递增,并在查询特定资源时包含在ETag HTTP Header数据中.我不想在集合中的每个资源上调用GET,而是希望在集合GET中获取@Version,这样我就可以编写我的应用程序来检查每个资源更新的@Version值,而不执行n加法GET循环 – 旅行.

有没有办法在集合GET的每个资源中包含@Version字段?

实体定义如下所示:

@Data @Entity @EntityListeners(AuditingEntityListener.class)public class Person {    @Id    @GeneratedValue(strategy = GenerationType.AUTO)    private long id;    @CreatedDate    @Column(nullable=false)    private Instant createdDate;    @LastModifiedDate    @Column(nullable=false)    private Instant lastModifiedDate;    @Version    @JsonProperty    private Long version;    …}

解决方法:

不,那里没有. ETag是HTTP等同于后端中表示为@Value属性的HTTP. Spring Data REST将所有在HTTP协议中具有相应机制的后端相关属性转换为:ids成为URI(也不应成为有效负载的一部分),@ LastModifiedDate属性成为头,@ Version属性,成为ETag.

原因很简单:如果您使用HTTP,请使用可用的协议方法来实现在数据访问级别上实现的内容.这是Spring Data REST不仅仅是将数据库暴露给Web而是实际检查模型并将模型特征转换为协议特定方法的一个方面.

简而言之:使用Spring Data REST,您有两种更新选项:

>只是没有If-Match标头的PUT – 强制覆盖服务器上存在的任何内容,因为聚合被加载,传入的数据映射到它并且它被写回.如果另一个客户端在此期间更改了聚合(尽管这是一个非常短的窗口),您仍然可以应用乐观锁定.如果是这种情况,你会看到409冲突.
>使用If-Match标头进行PUT – Spring Data REST根据聚合的version属性的当前值检查提交的ETag,并在该点出现不匹配的情况下返回412 Precondition Failed.在这种情况下,客户端可以查找资源的当前状态并决定如何继续.他们可能只是决定在没有If-Match标头的情况下使用PUT覆盖服务器上的内容.

可以对GET请求进行类似的优化:

> GET with If-None-Match(ETag)/ If-Modified-Since(带有Last-Modified标头值) – 如果资源仍处于与之前相同的状态,您将看到304 Not Modified,从而避免为响应花费带宽.
>普通GET将始终返回表示.

来源:https://www.icode9.com/content-4-471501.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Spring认证中国教育管理中心-Spring Data REST框架教程三
Web Service 那点事儿(4)—— 使用 CXF 开发 REST 服务
SpringBootAdmin界面化监控
如何让Spring Boot 的配置 “动” 起来?
Spring MVC REST异常处理最佳实践(下)
delphi datasnap 服务器 接受 Post Get 方式的参数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服