我如何从dropwizard返回404 http状态

时间:2015-03-17 21:17:31

标签: dropwizard

新的dropwizard!无论如何,我可以从apis手动返回不同的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;
}

3 个答案:

答案 0 :(得分:10)

这就像投掷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

答案 1 :(得分:9)

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

//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();
}

答案 2 :(得分:4)

最简单的方法是返回Optional<MyObject>。如果您使用dropwizard-java8软件包,Dropwizard会在您的结果为Optional.absent()Optional.empty()时自动抛出404。

只是做:

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

显然,您需要根据Guava返回Optional.fromNullable(get(id))或Java8包的Optional.ofNullable(get(id))来更新DAO。

除非您想要返回Response200以外的自定义状态代码,否则无需使用自定义404个对象