Создать ответ с заголовком местоположения в JAX-RS

У меня есть классы, автоматически генерируемые в NetBeans с шаблоном RESTful от сущностей, с функциями CRUD (аннотированные с помощью POST, GET, PUT, DELETE). У меня возникла проблема с методом create, который после вставки объекта из внешнего интерфейса я хотел бы создать для обновления ответа, чтобы мое представление автоматически (или асинхронно, если это правильный термин) отражало добавленную сущность.

Я наткнулся на эту (примерную) строку кода, но написанную на С# (о которой я ничего не знаю):

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

Использование JAX-RS в Java, так или иначе, чтобы получить текущий HttpContext, как в С#, и управлять заголовком?

Ближе всего я пришел

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

и этот, безусловно, не работает. Кажется, мне нужно получить текущий HttpContext, прежде чем создавать ответ.

Спасибо за вашу помощь.

Ответ 1

Я думаю, вы хотите сделать что-то вроде Response.created(createdURI).build(). Это создаст ответ с 201 Created, при этом createdUri будет значением заголовка местоположения. Обычно это делается с помощью POST. На стороне клиента вы можете вызвать Response.getLocation(), который вернет новый URI.

В API ответов

Помните о location, который вы указываете методу created:

URI нового ресурса. Если предоставлен относительный URI, он будет преобразован в абсолютный URI, разрешив его относительно URI запроса.

Если вы не хотите полагаться на пути статических ресурсов, вы можете получить текущий путь uri из класса UriInfo. Вы могли бы сделать что-то вроде

@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();
    }
}

Это создало бы местоположение .../customers/1 (или что бы это ни было customerId) и отправило его как заголовок ответа

Обратите внимание, что если вы хотите отправить объект вместе с ответом, вы можете просто прикрепить entity(Object) к цепочке методов Response.ReponseBuilder

Ответ 2

 @POST
public Response addMessage(Message message, @Context UriInfo uriInfo) throws URISyntaxException
{
    System.out.println(uriInfo.getAbsolutePath());

    Message newmessage = messageService.addMessage(message);

    String newid = String.valueOf(newmessage.getId()); //To get the id

    URI uri = uriInfo.getAbsolutePathBuilder().path(newid).build();

    return Response.created(uri).entity(newmessage).build();
}