在REST / Java中,如果我的对象为null,我应该返回什么?

时间:2014-11-11 10:18:13

标签: java json rest jersey jax-rs

我有一个简单的POJO,我用REST注释注释如下:

@GET
@Path("/domains/{domainid}")
@Override
public Domain getDomain(@PathParam("domainid") UUID domainID) throws Exception {
    logger.info("Retrieving domain "+ domainID);
    Domain d = null;
    try {
        d = MyClient.getDomains().get(domainID.toString());
        logger.debug("Returning "+d.getName());
    } catch (Exception e) {
        logger.error("Could not retrieve domain", e);
    }
    return d;
}

请注意,包含d.getName()的日志语句实际上可以抛出一个NPE,然后捕获并记录该NPE。这不是很好,但这也不是重点。

最终d是否有价值,我将其归还。

在空值的情况下,我的客户端收到HTTP 204状态代码。这就是wget显示的内容:HTTP request sent, awaiting response... 204 No Content

奇怪的是,我的浏览器并没有让步。它们仍然显示上一页(我认为在没有收到内容时保持放置是有意义的)。我原本期待一个空白页面。

三个问题:

  • HTTP 204是否会返回正确的响应?
  • 如何通过注释控制?通过其他配置?
  • 关于null对象的标准REST最佳实践是什么?

由于

===编辑===

这里有一个很好的问题:Is it correct to return 404 when a REST resource is not found?

1 个答案:

答案 0 :(得分:11)

如果请求尝试获取/定位/查找资源,并且无法找到它,传统上我们应该发送404 Not Found。有待进一步讨论see here

话虽如此,我通常希望我的资源方法返回Response,因为它更容易按照我想要的方式微调响应(一点点 - 不多 - 更多细节{{3 }})。但是看看你的方法如何覆盖接口契约(并返回一个模型对象),JAX-RS为我们提供了一个很好的异常层次结构,它将被映射到特定的响应/状态。列表可以是here

因此,在您的特定情况下,如果找不到资源,您可以抛出WebApplicationException(Response.Status.NOT_FOUND)NotFoundException,并且异常将映射到404 Not Found。像

这样的东西
d = MyClient.getDomains().get(domainID.toString());
if (d == null) {
    throw new NotFoundException();  // <-- JAX-RS 2.0
    // or throw new WebApplicationException(Response.Status.NOT_FOUND);
                                    // ^^  JAX-RS 1.x 
}

抛出异常时该方法将退出,客户端将收到404 Not Found状态的响应。


相关问答


修改

在第一行我说&#34;如果请求是尝试获取/定位/找到资源..&#34; ,但实际上,这几乎适用于所有情况我们正在使用Is it correct to return 404 when a REST resource is not found?,无论是GET,POST,PUT,DELETE等等。考虑这个例子

@PUT
@Path("/customers/{id}")
public Response updateCustomer(@PathParam("id") long id, Customer customer) {
    ...
}

这是一种允许客户通过PUT更新客户的方法。在尝试更新资源之前,客户端应该知道资源的完整URI。如果在数据库中找不到{id}参数(用于查找),则表示该资源不存在,并且还应将404 Not Found返回给客户端。