# Java client example for real-time updates using RESTful calls

### Prerequisite:

Have your service account created, download your private key.

### Get started:

1.  Download the [Java client
    library](https://dl.google.com/mapsbooking/apiclients/v1alpha/mapsbooking_java_public.zip)
    , unzip the file to get the 'mapsbooking' package.

2.  Create a java project in your IDE, download the sample codes
    (InventoryUpdate.java & BookingNotification.java), import them into your
    java project under src directory.

3.  Make a copy of your private key (JSON file) to the src directory.

4.  Add the Java Client Library to the dependencies of your project

5.  In both java files, follow the TODOs to complete your implementations

More detail about the REST API can be found
[here.](https://developers.google.com/maps-booking/reference/maps-booking-api/rest/)

### Troubleshooting:

1.  Create a merchant/service with existing merchantId/serviceId, your will get
    following error message: 409 Conflict { "code" : 409, "errors" : \[ {
    "domain" : "global", "message" : "Requested entity already exists",
    "reason" : "alreadyExists", "debugInfo" : "detail: \"\[ORIGINAL ERROR\]
    generic::already_exists: ..."\n" } \], "message" : "Requested entity already
    exists", "status" : "ALREADY_EXISTS" }

2.  Update/Delete with wrong merchantId/serviceId (update with wrong bookingId),
    your will get following error message: 404 Not Found { "code" : 404,
    "errors" : \[ { "domain" : "global", "message" : "Requested entity was not
    found.", "reason" : "notFound", "debugInfo" : "detail: \"\[ORIGINAL ERROR\]
    spanner::Row not found:...\"\n" } \], "message" : "Requested entity was not
    found.", "status" : "NOT_FOUND" }

3.  In all update functions, the parameter 'updateMask' must be in
    [FieldMask](https://developers.google.com/protocol-buffers/docs/reference/google.protobuf#fieldmask)
    format to specify the fields to update. The API is required to only change
    the values of the fields as specified in the mask and leave the others
    untouched. If you pass the wrong updateMask string, the update will not take
    effect. If a field mask is not present on update, the operation applies to
    all fields (as if a field mask of all fields has been specified). So if you
    want to update all fields, just set the updateMask empty.

4.  Since an Availability Slot is not associated with a merchant_id/service_id,
    if you make the replace availability calls with invalid
    merchant_id/service_id, you will be able to make the REST call without any
    issue, but your request will not be served in the production due to the
    invalid merchant_id/service_id.

5.  Any field that has a zero value is not shown in the response.
