Files
spring-data-examples/rest/headers
Oliver Gierke 2314c6e726 #186 - Prepare upgrade to Spring Boot 1.4 M2 and Hibernate 5.
Upgraded to Spring Boot 1.4 M2 and thus Hibernate 5.1 transitively.
Switched to H2 as database for all examples using JPA by accident as the
invalid error logging for HSQLDB schema creation got worse in 5.1 (see
[0]). The JPA examples themselves have to stay on HSQLDB as H2 doesn't
support stored procedures. The stored procedures example in turn has to
be downgraded to 5.0.7 as all following versions currently break stored
procedure execution support [1]. Reworked the JPA auditing example as
5.1 breaks on generic types used in support types like AbstractAuditable
[2].

Tweaked content type assertions in some REST related test cases as
Spring 4.3 returns an encoding alongside the media type.

[0] https://hibernate.atlassian.net/browse/HHH-10605
[1] https://hibernate.atlassian.net/browse/HHH-10515
[2] https://hibernate.atlassian.net/browse/HHH-10514
2016-04-13 18:11:09 +02:00
..
2015-07-16 09:10:20 +02:00

= Spring Data REST - Headers example

This example shows how Spring Data REST auto-populates response headers for item resources and considers these values when conditional `GET` requests are used

== Auto-populated headers

If entities use optimistic locking (usually by demarcating a particular property as version property using a store-specific annotation), Spring Data REST will use the value stored in that property to populate the `ETag` header for `GET` and `HEAD` requests to the item resource.

If http://docs.spring.io/spring-data/jpa/docs/current/reference/html/#auditing[Spring Data's auditing capabilities] are activated (using `@EnableJpaAuditing` in this case), the `Last-Modified` header is populated with the value of the last-modified property. See the `Customer` domain class for how to mark those.

== Conditional GET requests

The response headers can be used to issue conditional GET requests to save bandwidth in case the resource hasn't changed on the server:

.Conditional GET using If-Modified-Since
====
[source,bash]
----
$ curl http://localhost:8080/customers/1 -i -H "If-Modified-Since: Wed, 08 Apr 2015 17:24:20 GMT"
----

[source,http]
----
HTTP/1.1 304 Not Modified
----
====

.Conditional GET using If-None-Match
====
[source,bash]
----
$ curl http://localhost:8080/customers/1 -i -H "If-None-Match: 0"
----

[source,http]
----
HTTP/1.1 304 Not Modified
----
====

== Spring RESTDocs

The sample uses https://github.com/wilkinsona/spring-restdocs[Spring RESTDocs] to document the HTTP interaction implemented using the test cases. See `WebIntegrationTests.setUp()` for general setup and the individual test methods with their usage of `….andDo(document(…))`.