当前位置: 首页 > 面试题库 >

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

尉迟卓
2023-03-14
问题内容

我有一个简单的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 204是要返回的正确响应吗?
  • 如何通过注释控制它?通过其他配置
  • 关于空对象的标准REST最佳实践是什么?

谢谢

编辑


问题答案:

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

话虽这么说,我一般喜欢让我的资源方法返回Response,因为它更容易微调的回应,我想要的方式(一点点-不多-。但是,鉴于您的方法如何覆盖接口协定(并返回模型对象),JAX-
RS为我们提供了一个很好的异常层次结构,该异常层次结构将映射到特定的响应/状态。

因此,在您的特定情况下,如果找不到资源,则可以引发WebApplicationException(Response.Status.NOT_FOUND)NotFoundException,并且异常将映射到404找不到。就像是

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。



 类似资料:
  • 注意,包括在内的log语句实际上可以抛出一个NPE,然后捕获并记录该NPE。这并不漂亮,但这也不是这里的重点。 最终,无论是否有值,我都会返回它。 在值的情况下,客户端将收到HTTP 204状态码。这是显示的内容: null 谢谢 这里有一个关于相同主题的很好的问题:当没有找到REST资源时返回404是正确的吗?

  • 是否可以将此代码转换为Java8可选的单行表达式? i、 如果某个对象不是null,我需要调用一个对象方法并返回其结果,否则返回0<代码>可选。不可数()。orElse()不适合,因为它返回相同类型的对象,但我需要方法调用的结果或一些默认值。

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

  • 当某个对象具有装箱类型属性时,该属性的getter返回。但是这应该返回,因为boxed type属性的默认值是。这里有什么问题?

  • 在单元测试(Groovy和Spock)的中,我用mock填充上面的字段: 接下来,在我的测试用例中,我调用一个方法,我希望从中获取,该方法来自步骤中的模拟对象: 问题是,对于,我将获得。 这是因为我以错误的方式使用Groovy吗?如何使成为它应该成为的对象?我应该使用mock/stub吗?

  • 我有以下JPQL查询: 这应该返回所有对具有NULL的。 但是,我正在运行代码并进行调试,我看到返回的集合包含此字段为null的实体。 这是JPQL中的错误吗?