【问题标题】:In REST / Java, what should I return if my object is null?在 REST / Java 中,如果我的对象为空,我应该返回什么?
【发布时间】:2015-01-07 20:39:18
【问题描述】:

我有一个简单的 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,然后将其捕获并记录下来。这不漂亮,但这也不是重点。

最终不管d有没有值,我都返回。

对于 null 值,我的客户端会收到 HTTP 204 状态代码。这是wget 显示的内容:HTTP request sent, awaiting response... 204 No Content

奇怪的是,我的浏览器一动不动。他们仍然显示上一页(我认为当没有收到内容时保持原状是有意义的)。我本来希望是空白页。

三个问题:

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

谢谢

编辑

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

【问题讨论】:

标签: java json rest jersey jax-rs


【解决方案1】:

如果请求试图 GET/locate/find 资源,但找不到,传统上,我们应该发送 404 Not Found。进一步讨论see here

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


相关问答


编辑

在第一行我说“如果请求试图获取/定位/查找资源..”,但实际上,这几乎适用于我们使用URI templates的所有情况,无论是用于 GET、POST、PUT、DELETE,等等。考虑这个例子

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

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

【讨论】:

  • 我很想说使用 NotFoundException() 会将我的实现与 REST 绑定,但再次使用注释也可以做到这一点,对吧?
  • 如果您不想抛出这些 JAX-RS 异常之一,您可以编写 ContainerResponseFilter 并在过滤器中抛出异常,或显式设置状态。但话又说回来,就像你说的,JAX-RS 注释已经把你联系起来了
猜你喜欢
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
  • 2015-12-23
  • 1970-01-01
  • 2021-02-10
  • 1970-01-01
相关资源
最近更新 更多