2015-03-17 9 views
5

nowy do dropwizard! czy jest tak, że mogę ręcznie zwrócić różne kody stanu http z apis? w zasadzie coś podobnego do tego!jak mogę przywrócić stan http 404 z dropwizard

@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; 
} 

Odpowiedz

6

Polecam używanie obiektu odpowiedzi JAX-RS zamiast zwracania rzeczywistego obiektu domeny w odpowiedzi. Służy jako doskonały normą w tym metadanych z obiektu odpowiedzi i zapewnia piękny budowniczy do obsługi kodów stanu, nagłówki, typy zawartości klienta itp

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

niesamowite, właśnie tego szukałem! – nightograph

+0

cieszę się, że pomogę @nightograph! – th3morg

+0

Dokument dropwizard stwierdza, że ​​wyrzucanie wyjątku WebApplicationException powinno być preferowane w celu zwrócenia odpowiedzi (patrz http://dropwizard.io/manual/core.html#responses), co sprawia, że ​​klasy zasobów w koszulkach są bardziej testowalne. Ale tak, obie prace. –

9

To tak proste, jak wyrzucenie 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; 
} 

Jak się dalej wzdłuż może chcesz złożyć zamówienie wyjątki, które można read more about here.

+0

CF doc dropwizard: http://dropwizard.io/manual/core.html #responses –

4

Najprostszym sposobem jest zwrócenie Optional<MyObject>. Dropwizard automatycznie rzuci 404, gdy twój wynik będzie Optional.absent() lub Optional.empty(), jeśli użyjesz pakietu dropwizard-java8.

Wystarczy zrobić:

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

Oczywiście trzeba zaktualizować DAO według wracając Optional.fromNullable(get(id)) dla Guava lub Optional.ofNullable(get(id)) dla Java8 wiązki.

Nie ma potrzeby, aby bawić się z obyczaju Response obiektów, chyba że chcesz wrócić kod stanu zwyczaj poza 200 i 404

+0

Elegancki i działa świetnie (dw 1.0.3, java 8). Uznałbym to za zaakceptowaną odpowiedź, gdybym mógł – Andrejs