我有一个简单的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是否具有值,我将其返回。
如果为空值,我的客户端会收到HTTP 204状态代码。这是wget显示的内容:HTTP request sent, awaiting response... 204 No Content
HTTP request sent, awaiting response... 204 No Content
奇怪的是,我的浏览器没有动弹不得。它们仍显示前一页(我想在没有内容接收时保持原样是有意义的)。我本来希望有一个空白页。
三个问题:
谢谢
如果请求正在尝试获取/定位/查找资源,但找不到该资源,传统上,我们应该发送404未找到。有关进一步的讨论,请参见此处。
话虽这么说,我一般喜欢让我的资源方法返回Response,因为它更容易微调的回应,我想要的方式(一点点-不多-。但是,鉴于您的方法如何覆盖接口协定(并返回模型对象),JAX- RS为我们提供了一个很好的异常层次结构,该异常层次结构将映射到特定的响应/状态。
Response
因此,在您的特定情况下,如果找不到资源,则可以引发WebApplicationException(Response.Status.NOT_FOUND)或NotFoundException,并且异常将映射到404找不到。就像是
WebApplicationException(Response.Status.NOT_FOUND)
NotFoundException
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模板,无论是对GET,POST,PUT,删除,随便。考虑这个例子
@PUT @Path("/customers/{id}") public Response updateCustomer(@PathParam("id") long id, Customer customer) { ... }
这是一种允许客户通过PUT更新客户的方法。客户端在尝试更新资源之前应该知道该资源的完整URI。如果{id}在数据库中找不到该参数(用于查找),则说明该资源不存在,并且还应向客户端返回404 Not Found。
{id}