2013-06-05 38 views
6

Khi phun (spray.io) tạo ra một từ chối, nó phản ứng với một chuỗi cơ thể. Vì tất cả các API khách hàng của tôi sẽ giả định rằng API của tôi chỉ trả về json, tôi muốn toàn cầu làm cho mọi từ chối một đối tượng json hợp lệ tuân theo định dạng đối tượng lỗi của chúng tôi. Làm thế nào tôi có thể làm điều này xảy ra?Làm cách nào để biến tất cả các từ chối thành json tùy chỉnh trong phun?

Định dạng đối tượng lỗi trông như thế này

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

Các errorType là nội bộ danh sách enum kiểu của tôi về giá trị như UserNotFoundNeedPaidAccount

Trả lời

13

Nếu bạn chỉ muốn chuyển tất cả các từ chối vào tùy chỉnh của bạn định dạng json, bạn có thể tạo trình xử lý từ chối. Ví dụ: tôi sẽ đặt điều này trong số ServiceActor của tôi và thực hiện như sau:

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

Hiện tại có vẻ như 'fromPF' không tồn tại. 'RejectionHandler {' hoạt động như dự định. – dmitry