2013-06-05 12 views
6

Gdy spray (spray.io) wywołuje odrzucenie, odpowiada ciałem smyczkowym. Ponieważ wszyscy moi klienci API przyjmą, że mój interfejs API zwraca tylko json, chciałbym, aby każde odrzucenie było prawidłowym obiektem json zgodnym z naszym formatem obiektu błędu. Jak mogę to zrobić?Jak przekształcić wszystkie odrzucenia w niestandardowe json w sprayu?

Format przedmiot błąd wygląda tak

{ 
    'details' : 'Something happened in the app. boooo!', 
    'errorType' : 'Unknown' 
} 

errorType jest moja wewnętrzna lista enum stylu wartości jak UserNotFound i NeedPaidAccount

Odpowiedz

13

Jeśli chcesz po prostu wyłączyć wszystkie odrzuceń w swoim zwyczaju Format json, możesz utworzyć procedurę obsługi odrzucania. Na przykład umieści to w moim ServiceActor i wykonaj następujące czynności:

class ApiServiceActor extends Actor with HttpServiceActor with ApiServices { 
    def jsonify(response: HttpResponse): HttpResponse = { 
    response.withEntity(HttpBody(ContentType.`application/json`, 
     JSONObject(Map(
     "details" -> response.entity.asString.toJson, 
     "errorType" -> ApiErrorType.Unknown.toJson 
    )).toString())) 
    } 

    implicit val apiRejectionHandler = RejectionHandler { 
    case rejections => mapHttpResponse(jsonify) { 
     RejectionHandler.Default(rejections) 
    } 
    } 

    def receive = runRoute { 
    yourRoute ~ yourOtherRoute ~ someOtherRoute 
    } 
} 
+1

Obecnie wygląda na to, że 'fromPF' nie istnieje. "RejectionHandler" działa zgodnie z przeznaczeniem. – dmitry

Powiązane problemy