2013-06-05 2 views
6

Когда спрей (spray.io) производит отторжение, он реагирует на тело струны. Поскольку все мои клиенты API предполагают, что мой API возвращает только json, я бы хотел, чтобы глобальное преобразование сделало каждое отклонение действительным json-объектом, соответствующим нашему формату объекта ошибки. Как я могу это сделать?Как превратить все отклонения в пользовательский json в спрее?

Формат объекта ошибки выглядит следующим образом

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

ERRORTYPE мой внутренний список перечисление стиля значения как UserNotFound и NeedPaidAccount

ответ

13

Если вы просто хотите, чтобы включить все отказы в пользовательский json, вы можете создать обработчик отклонения. Например, я помещу это в моем ServiceActor и сделайте следующее:

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

В настоящее время, кажется, 'fromPF' не существует. 'RejectionHandler {' работает по назначению. – dmitry

Смежные вопросы