在JAX RS中,返回Response和Bean或Bean集合(DTO)之间的差异

Hal*_*lex 43 rest jax-rs java-ee-web-profile

我正在构建一个REST API.我的问题是,在使用Jersey时,我的服务构建和返回Response对象或返回bean或集合之间有什么区别.我只关心成功的电话,我正在为错误和特殊情况抛出适当的例外.

这是一个例子:

@Produces(MediaType.APPLICATION_JSON)
public Response search(FooBean foo){
    List<FooBean> results = bar.search(foo);
    return Response.ok(results).build();
}
Run Code Online (Sandbox Code Playgroud)

@Produces(MediaType.APPLICATION_JSON)
public List<FooBean> search(FooBean foo){
    List<FooBean> results = bar.search(foo);
    return results;
}
Run Code Online (Sandbox Code Playgroud)

我已经看过两个例子,我更喜欢第二种情况,只是为了更容易识别服务方法.我已经检查了对这两种方法的反应,看起来它们是相同的.

思考?

Per*_*ion 39

JAX-RS规范解释了这些差异:

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

需要使用响应提供其他元数据的方法应返回Response实例,ResponseBuilder类提供了使用构建器模式创建Response实例的便捷方法.

'Regular'bean以几乎相同的方式映射Response,除了a Response允许您设置其他元数据(响应头,专用状态,专用内容类型等).至于哪一个使用,完全取决于你自己决定 - Response给你更多的灵活性,但常规豆更"自我记录".


Dei*_*zan 8

如果你想总是返回响应200 - OK,捕获并操纵在方法返回结果之前可能发生的所有异常,并且有拦截或者,则没有区别WebApplicationException.因此,这两种方法都会产生相同的响应.

唯一的区别在于特定的场景,比如返回null对象或创建对象,如下例所示:

@POST
@Consumes("application/json")
public Response post(String content) {
    URI createdUri = ...
    Object createdContent = create(content);
    return Response.created(createdUri).entity(createdContent).build();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,返回将是201 - CREATED(使用URI访问创建的对象)

那么,以下方法:

@POST
@Consumes("application/json")
public Object post(String content) {
    URI createdUri = ...
    Object createdContent = create(content);
    return createdContent;
}
Run Code Online (Sandbox Code Playgroud)

......将返回回复 200 - OK

如果您不关心客户端将收到哪种响应状态,则可以毫无问题地使用任何声明.

来源:泽西岛.