Dav*_*ard 6 java rest json jax-rs jersey
我有一个简单的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;
}
Run Code Online (Sandbox Code Playgroud)
请注意,包含d.getName()的日志语句实际上可以抛出一个NPE,然后捕获并记录该NPE.这不是很漂亮,但这也不是重点.
最终d是否有价值,我将其归还.
在空值的情况下,我的客户端收到HTTP 204状态代码.这是wget显示的内容:HTTP request sent, awaiting response... 204 No Content
奇怪的是,我的浏览器并没有让步.它们仍然显示上一页(我认为在没有收到内容时保持放置是有意义的).我原本期待一个空白页面.
三个问题:
谢谢
===编辑===
这里有一个很好的问题:在找不到REST资源时返回404是否正确?
Pau*_*tha 12
如果请求尝试获取/定位/查找资源,并且无法找到它,传统上,我们应该发送404 Not Found.关于进一步的讨论在这里看到.
话虽这么说,我通常喜欢让我的资源方法返回Response,因为它更容易按照我想要的方式微调响应(一点点 - 不多 - 这里有更多细节).但是看看你的方法如何覆盖接口契约(并返回一个模型对象),JAX-RS为我们提供了一个很好的异常层次结构,它将被映射到特定的响应/状态.列表可以在这里看到.
因此,在您的特定情况下,如果找不到资源,您可以抛出a WebApplicationException(Response.Status.NOT_FOUND)或a 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
}
Run Code Online (Sandbox Code Playgroud)
抛出异常时该方法将退出,客户端将收到404 Not Found状态的响应.
相关问答
编辑
在第一行我说"如果请求试图获取/定位/找到资源......",但实际上,这适用于我们使用URI模板的几乎所有情况,无论是用于GET,POST,PUT,删除,无论如何.考虑这个例子
@PUT
@Path("/customers/{id}")
public Response updateCustomer(@PathParam("id") long id, Customer customer) {
...
}
Run Code Online (Sandbox Code Playgroud)
这是一种允许客户通过PUT更新客户的方法.在尝试更新资源之前,客户端应该知道资源的完整URI.如果{id}在数据库中找不到参数(用于查找),则表示该资源不存在,并且还应将404 Not Found返回给客户端.
| 归档时间: |
|
| 查看次数: |
10689 次 |
| 最近记录: |