我如何 return 来自 dropwizard 的 404 http 状态

how can i return 404 http status from dropwizard

dropwizard 的新手!无论如何,我可以从 api 手动 return 不同的 http 状态代码吗?基本上类似于这个!

@GET
@Timed
public MyObject getMyObject(@QueryParam("id") Optional<String> id) {
    MyObj myObj = myDao.getMyObject(id)
    if (myObj == null) {
          //return status.NOT_FOUND; // or something similar 
          // or more probably 
          // getResponseObjectFromSomewhere.setStatus(mystatus)

    }

    return myObj;
}

就像扔一个 WebApplicationException 一样简单。

@GET
@Timed
public MyObject getMyObject(@QueryParam("id") Optional<String> id) {
  MyObject myObj = myDao.getMyObject(id)
  if (myObj == null) {
    throw new WebApplicationException(404);
  }
  return myObj;
}

随着您的深入,您可能希望将自定义异常放在一起,您可以 read more about here

我建议使用 JAX-RS 响应 object 而不是在响应中返回您的实际域 object。它是将元数据包含在您的响应中的优秀标准 object,并提供了一个很好的构建器来处理状态代码、headers、客户内容类型等。

//import javax.ws.rs.core.Response above
@GET
@Timed
public Response getMyObject(@QueryParam("id") Optional<String> id) {
  MyObject myObj = myDao.getMyObject(id)
  if (myObj == null) {
    //you can also provide messaging or other metadata if it is useful
    return Response.status(Response.Status.NOT_FOUND).build()
  }
  return Response.ok(myObj).build();
}

最简单的方法是 return 一个 Optional<MyObject>。如果您使用 dropwizard-java8 包,当您的结果为 Optional.absent()Optional.empty() 时,Dropwizard 将自动抛出 404。

就这样:

@GET
@Timed
public Optional<MyObject> getMyObject(@QueryParam("id") Optional<String> id) {
    Optional<MyObject> myObjOptional = myDao.getMyObject(id)
    return myObjOptional;
}

显然,您需要根据 returning Optional.fromNullable(get(id)) for Guava 或 Optional.ofNullable(get(id)) for Java8 bundle 更新您的 DAO。

除非您想 return 在 200404[=19= 之外使用自定义状态代码,否则无需使用自定义 Response 对象]