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

Ash*_*nse 16 java rest web-services jax-rs jersey

我正在使用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());
        }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Rya*_*art 20

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

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

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


sec*_*ing 12

如果你想抛出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();
}
Run Code Online (Sandbox Code Playgroud)


Bog*_*dan 8

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

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状态代码.

[...]

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

3.3.4例外情况

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

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

[...]

所以你应该返回null,void或者建立一个204响应.你抛出异常,只有当它在你的应用程序中的例外情况,并抛出异常了这一点.