我有一个简单的 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 请求已发送,正在等待响应...204 无内容
奇怪的是,我的浏览器丝毫不动。他们仍然显示上一页(我想当没有收到内容时留在原地是有意义的)。我本以为是空白页。
三个问题:
- HTTP 204 是要返回的正确响应吗?
- 如何通过注释来控制它?通过其他配置?
- 关于空对象的标准 REST 最佳实践是什么?
谢谢
编辑
这里有一个关于同一主题的好问题:Is it correct to return 404 when a REST resource is not found?
最佳答案
如果请求试图获取/定位/查找资源,但无法找到,传统上,我们应该发送 404 Not Found。进一步讨论 see here .
也就是说,我通常喜欢让我的资源方法返回 Response
,因为这样可以更轻松地按照我想要的方式微调响应(一点点 - 不多 - 更多细节 here )。但是看看您的方法如何覆盖接口(interface)契约(并返回模型对象),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 的响应。
相关问答
- How to catch 404 (NotFoundException) without being dependant on a JAX-RS implementation?
- Is it correct to return 404 when a REST resource is 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。
关于java - 在 REST/Java 中,如果我的对象为 null,我应该返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26862500/