在JAX-RS中未返回Response对象时,将标头添加到HTTP响应

时间:2016-02-02 08:27:58

标签: rest jax-rs cxf

我正在使用CXF 3.1.4和JAX-RS创建REST服务。我创建了一个在客户端和服务器之间共享的接口:

public interface SubscriptionsService {

    @POST
    @Path("/subscriptions")
    SubscriptionResponse create(SubscriptionRequest request);
}

public class SubscriptionResponse {
    private String location;
}

使用JAXRSClientFactoryBean创建客户端,并使用JAXRSServerFactoryBean创建服务器。

上面定义的create()方法应返回Location标题,但我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

由于您需要返回SubscriptionResponse对象而不是Response对象,因此可以使用HttpServletResponse注释在JAX-RS enpoint类中注入Context,设置201状态代码和Location标题:

@Context 
HttpServletResponse response;

@POST
@Path("/subscriptions")
public SubscriptionResponse create(SubscriptionRequest subscriptionRequest) {

    // Persist your subscripion to database

    SubscriptionResponse subscriptionResponse = ...
    URI createdUri = ...

    // Set HTTP code to "201 Created" and set the Location header
    response.setStatus(HttpServletResponse.SC_CREATED);
    response.setHeader("Location", createdUri.toString());

    return subscriptionResponse;
}

返回Response对象后,您可以使用Response API添加Location标头,如下所示:

@POST
@Path("/subscriptions")
public Response create(SubscriptionRequest subscriptionRequest) {

    // Persist your subscripion to database

    URI createdUri = ...
    return Response.created(createdUri).build();
}

有关详细信息,请查看Response.created(URI)方法文档。