builder = Response . noContent ();
return builder . build ();
The updateCustomer() method obtains a customer ID and an instance of
javax.ws.rs.core.Request from the injected parameters. It then locates an instance of a
Customer object in some application-specific way (for example, from a database). From this
current instance of Customer , it creates an EntityTag from the hash code of the object. It
also finds the current timestamp of the Customer instance in some application-specific way.
The Request.evaluatePreconditions() method is then called with timestamp and tag
variables. If these values do not match the values within the If-Match and If-Unmodified-
Since headers sent with the request, evaluatePreconditions() sends back an instance of
a ResponseBuilder initialized with the error code 412, “Precondition Failed.” A Response
object is built and sent back to the client. If the preconditions are met, the service performs
the update and sends back a success code of 204, “No Content.”
With this code in place, we can now worry less about concurrent updates of our resources.
One interesting thought is that we did not have to come up with this scheme ourselves. It is
already defined within the HTTP specification. This is one of the beauties of REST, in that it
fully leverages the HTTP protocol.
In this chapter, you learned that HTTP has built-in facilities to help scale the performance of
our distributed systems. HTTP caching is a rich protocol that gives us a lot of control over
browser, proxy, and client caches. It helps tremendously in reducing network traffic and
speeding up response times for applications. Besides caching, distributed systems also have
the problem of multiple clients trying to update the same resource. The HTTP protocol again
comes to the rescue with well-defined semantics for handling concurrent updates. For both
caching and concurrent updates, JAX-RS provides some helper classes to make it easier to
enable these features in your Java applications. Chapter 25 contains some code you can use
to test-drive many of the concepts in this chapter.