6

当 spray (spray.io) 产生拒绝时,它会以字符串体响应。由于我所有的 API 客户端都会假设我的 API 只返回 json,因此我希望全局将每个拒绝都设为符合我们错误对象格式的有效 json 对象。我怎样才能做到这一点?

错误对象格式如下所示

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

errorType 是我的内部枚举样式的值列表,例如UserNotFoundNeedPaidAccount

4

1 回答 1

13

如果您只想将所有拒绝转换为您的自定义 json 格式,您可以创建一个拒绝处理程序。例如,我将其放入 myServiceActor并执行以下操作:

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
  }
}
于 2013-06-05T00:00:07.047 回答