如何在RESTful Web服务中使用jersey框架抛出HTTP 204状态代码?

我正在使用jersey框架来开发RESTful Web服务。 我使用以下代码抛出各种HTTP状态代码和响应:

public class RestNoContentException extends WebApplicationException { public RestNoContentException(String message) { super(Response.status(Status.NO_CONTENT) .entity(message).type("text/plain") .build()); } } 

在使用Firefox Mozilla rest客户端工具测试REST Web服务时,它显示200 OK状态而不是204 NO CONTENT 。 我正在处理其他状态代码,就像我为状态代码204做的那样。 其他状态代码正在rest客户端工具上正确显示,但何时显示204状态代码,它显示200 OK状态代码。

有人可以帮帮我吗? 我错过了什么?

首先,204在响应代码的“成功”类别中,因此作为exception的结果返回它是非常非常奇怪的事情。

其次,204表示“无内容”,这意味着响应不包含任何实体,但您在其中放置了一个实体。 泽西岛很可能会把它换成200,除了它包含一个响应实体之外,它基本上与204相同。

最后,您可以通过几个内置行为非常简单地获得204个响应:void方法和null返回值都映射到204响应。 否则,只需返回Response.status(204).build()

如果你想抛出204,你不应该给实体:

 @GET @Produces(MediaType.TEXT_PLAIN) public Response test() { //return Response.status(Status.NO_CONTENT).entity("hello").build(); //this will throw 200 return Response.status(Status.NO_CONTENT).build(); } 

添加到现有的响应中只需添加一件事。 泽西岛正在做的是规范的正确行为 :

3.3.3返回类型

资源方法可以返回void,Response,GenericEntity或其他Java类型,这些返回类型映射到响应实体主体,如下所示:

void在具有204状态代码的空实体主体中生成结果。

响应从Response的实体属性映射的实体主体中的结果,其中状态代码由Response的status属性指定。 空返回值导致204状态代码。 如果未设置Response的status属性:200状态代码用于非null实体属性,如果entity属性为null,则使用204状态代码。

GenericEntity从GenericEntity的Entity属性映射的实体主体中的结果。 如果返回值不为null,则使用200状态代码,空返回值将生成204状态代码。

其他从返回实例的类映射的实体主体中的结果。 如果返回值不为null,则使用200状态代码,空返回值将生成204状态代码。

[…]

由于您使用的是exception,因此以下部分适用(强调我的):

3.3.4例外情况

资源方法,子资源方法或子资源定位器可以抛出任何已检查或未检查的exception。 实现必须捕获所有exception并按如下方式处理它们:

  1. WebApplicationException的实例必须映射到响应,如下所示。 如果exception的响应属性不包含实体,并且exception映射提供程序(请参阅第4.4节)可用于WebApplicationException,则实现必须使用提供程序创建新的Response实例, 否则直接使用response属性。 然后根据第3.3.3节处理生成的Response实例。

[…]

所以你应该返回null,void或者建立一个204响应。 只有在应用程序中出现exception情况并抛出exception时才会抛出exception。