menorah84 menorah84 - 2 months ago 16
Java Question

Create Response with Location header in JAX-RS

I have classes auto-generated in NetBeans with RESTful template from entities, with CRUD functions (annotated with POST, GET, PUT, DELETE). I have a problem with create method, which after inserting an entity from the frontend, I would like create to update a response so that my view will automatically (or asynchronously, if that's the right term) reflect the added entity.

I came across this (example) line of code but written in C# (of which I know nothing about):

HttpContext.Current.Response.AddHeader("Location", "api/tasks" +value.Id);


Using JAX-RS in Java, is there anyway to get the current HttpContext just like in C# and to manipulate the header?

The closest I came about is

Response.ok(entity).header("Location", "api/tasks" + value.Id);


and this one certainly is not working. It seems I need to get the current HttpContext before building the Response.

Thanks for your help.

Answer

I think you mean to do something like Response.created(createdURI).build(). This will create a response with a 201 Created status, with the createdUri being the location header value. Normally this is done with POSTs. On the client side, you can call Response.getLocation() which will return the new URI.

From the Response API

Keep in mind about the location you specify to the created method:

the URI of the new resource. If a relative URI is supplied it will be converted into an absolute URI by resolving it relative to the request URI.

If you don't want to rely on static resource paths, you could get the current uri path from the UriInfo class. You could do something like

@Path("/customers")
public class CustomerResource {
    @POST
    @Consumes(MediaType.APPLICATION_XML)
    public Response createCustomer(Customer customer, @Context UriInfo uriInfo) {
        int customerId = // create customer and get the resource id
        UriBuilder builder = uriInfo.getAbsolutePathBuilder();
        builder.path(Integer.toString(customerId));
        return Response.created(builder.build()).build();
    }
}

This would create the location .../customers/1 (or whatever the customerId is), and send it as the response header

Note if you want to send the entity along with the response, you can just attach the entity(Object) to the method chain of the Response.ReponseBuilder