在Spring数据REST(通过Spring 1.3.3启动),当我GET
的,资源集合比如说people
,在@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存储库时:
@Configuration
public class ApplicationRepositoryConfiguration
extends RepositoryRestMvcConfiguration
{
@Override
protected void configureRepositoryRestConfiguration(
RepositoryRestConfiguration config
)
{
config.exposeIdsFor(Person.class);
config.setBasePath("/api/");
}
}
该@Version
是加的更新,并包含在数据行的版本ETag HTTP头,当我查询特定的资源数据。不必GET在集合中的每个资源上调用a ,我更喜欢@Version在集合中获取,GET这样我可以编写我的应用程序来检查@Version
每个资源更新的值,而无需执行n附加GET往返。
有没有一种方法可以将@Version
字段包含在每个资源的集合中GET
?
实体定义如下所示:
@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
于后端中表示为属性的内容。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
资源仍与以前一样,你将看到一个,因此避免了为响应花费带宽。
GET
将始终返回该表示形式。本文向大家介绍为什么属性使用className而不是class呢?相关面试题,主要包含被问及为什么属性使用className而不是class呢?时的应答技巧和注意事项,需要的朋友参考一下 class是关键字 js会使用dom.className获取样式名,跟js保持一致
问题内容: 为什么在JavaScript中不推荐使用该属性? 它是在JavaScript中添加然后弃用的,但ECMAScript完全省略了它。某些浏览器(Mozilla,IE)一直都支持该浏览器,并且在地图上没有删除支持的计划。其他浏览器(Safari,Opera)已对此提供支持,但较旧的浏览器支持不可靠。 是否有充分的理由将这种有价值的功能置于边缘? (或者,是否有更好的方法来抓住调用函数的句柄
我见过类似的问题,但他们仍然没有意义,我的猿类大脑。 这里有一个例子。如果我在名为的头文件中声明了一个函数:并且在文件中声明了一个函数:。我在另一个文件(例如)中看到过这样的人,它只包含头,它只有声明(里面没有代码),而不包含带有代码的。但令我震惊的是,当他们调用中的函数时,它使用了中的代码并打印“hello”。怎么做?当我只包含了文件时,它如何打印在文件中添加的“hello”,而它只是一个声明,
在“Kotlin in Action”中,它说“如果一个成员属性引用了Person类的年龄属性,memberProperty.get(person)是一种动态获取person.age值的方法”,代码为(10.2.1 Kotlin Reflection API): 我不明白为什么这个例子提到“动态”获取属性的值。当我运行以下代码时,它才起作用: 是否有其他成员属性反射的案例或示例?
问题内容: 在Scrapy docs中,有以下示例说明如何在Scrapy中使用经过身份验证的会话: 我已经做好了,很好。但是 我的问题是 :正如他们在最后一行的评论中所说,您需要做什么? 问题答案: 在上面的代码中,用于进行身份验证的将该函数设置为其回调。这意味着该函数将被调用并传递登录尝试得到的页面作为响应。 然后,通过在页面中搜索特定的字符串(在本例中为)来检查您是否成功登录。如果找到它,蜘蛛
我正在尝试用maven-shade插件2.1构建一个uber-jar。我希望它包括我的jar和依赖jar中的所有类。但我发现它不包括依赖jar中的类。我可能做错了什么?以下是我在pom.xml中对maven-shade插件的用法。可能是因为finalName与project.artifactid相同吗?