2016-02-02 16 views
0

我正在使用CXF 3.1.4和JAX-RS创建REST服务。我已经创建了客户机和服务器之间共享的接口:在未返回JAX-RS中的Response对象时向HTTP响应添加标头

public interface SubscriptionsService { 

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

public class SubscriptionResponse { 
    private String location; 
} 

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

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

回答

1

因为你需要返回SubscriptionResponse对象,而不是一个Response对象,你可以使用Context注解注入你的JAX-RS enpoint类HttpServletResponse并设置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)方法文档。