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

我有一个简单的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最佳实践?

谢谢

===编辑===

这里有一个很好的问题:在找不到REST资源时返回404是否正确?

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

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

因此,在您的特定情况下,如果找不到资源,您可以抛出WebApplicationException(Response.Status.NOT_FOUND)NotFoundException ,并且exception将映射到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 } 

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


相关问答

  • 如何在不依赖于JAX-RS实现的情况下捕获404(NotFoundException)?
  • 在找不到REST资源时返回404是否正确?

编辑

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

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

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