当前位置: 首页 > 知识库问答 >
问题:

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

田镜
2023-03-14
@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()在内的log语句实际上可以抛出一个NPE,然后捕获并记录该NPE。这并不漂亮,但这也不是这里的重点。

最终,无论d是否有值,我都会返回它。

null值的情况下,客户端将收到HTTP 204状态码。这是wget显示的内容:HTTP请求已发送,正在等待响应...204无内容

    null

谢谢

这里有一个关于相同主题的很好的问题:当没有找到REST资源时返回404是正确的吗?

共有1个答案

亢仰岳
2023-03-14

如果请求试图获取/定位/查找资源,但找不到,传统上,我们应该发送404 Not found。有关进一步讨论,请参见此处。

也就是说,我通常喜欢让我的资源方法返回响应,因为这样更容易按照我想要的方式对响应进行微调(这里有一点--不是很多--更多的细节)。但是,考虑到您的方法是如何重写接口契约(并返回模型对象)的,JAX-RS为我们提供了一个很好的异常层次结构,这些异常将映射到特定的响应/状态。名单可以在这里看到。

因此,在您的特殊情况下,如果找不到资源,可以抛出WebApplicationException(response.status.not_find)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未找到的响应。

相关问答

  • 如何在不依赖于JAX-RS实现的情况下捕获404(NotFoundException)?
  • 找不到REST资源时返回404是否正确?
@PUT
@Path("/customers/{id}")
public Response updateCustomer(@PathParam("id") long id, Customer customer) {
    ...
}
 类似资料:
  • 问题内容: 我有一个简单的POJO,我用REST注释进行了注释,如下所示: 请注意,包括d.getName()的日志语句实际上可以引发NPE,然后将其捕获并记录。那不是很漂亮,但这里也不是重点。 最终d是否具有值,我将其返回。 如果为空值,我的客户端会收到HTTP 204状态代码。这是wget显示的内容: 奇怪的是,我的浏览器没有动弹不得。它们仍显示前一页(我想在没有内容接收时保持原样是有意义的)

  • 而且 不是应该都返回吗?它不是基元变量,在第二个代码中,即使在添加零之后,它也会打印。我知道装箱(对于从-128到127的整数),但是为什么装箱在第二段代码中起作用而不是在第一段代码中起作用呢?

  • 问题内容: 由于在Java中使用了泛型,我最终不得不实现一个具有as返回类型的函数: 并且编译器要求我返回 一些东西 。现在我只是返回,但是我想知道这是否是好的编码实践… 我问的是 V oid,而不是 V oid。类, 而不是 保留关键字。 我也试过,,,,没有回报可言,但都不会在所有的工作。(出于或多或少明显的原因) 那么,如果函数的返回类型为,我应该返回什么呢? 该课程的一般用途是什么? 问题

  • 注意:请通读后再回答。这看起来是一个简单的问题,但我不确定它是否如此简单。另外,我是打字新手,所以对我宽容点 所以这是用例。我有一个模型用户,我编写了一个通用函数来根据数据库中的电子邮件检查用户是否存在。如果存在,则返回用户对象。 现在,如果它是任何其他对象,那么我可以定义类型并继续我的代码,但它是我从DB得到的用户对象,不知道如何解决这个问题。 我通过提到返回类型“any”找到了解决方法,但我的

  • 但是,当我返回列表时,就像这段代码: 对于完全相同的API的列表返回类型的响应是正确的响应: [{“SellingPrice”:23000,“ID”:1,“Version”:1,“CreatedOn”:“25Feb 2019,05:53”,“LastUpdatedOn”:“25Feb 2019,05:53”}]