2016-01-21 7 views
1

Как я могу программно выполнить Route обработчика отклонения и получить результат HttpEntity?Как я могу программно выполнить Route of rejection handler и получить результат HttpEntity?

Например, предполагая, что у меня есть RequestContext объекта и Rejection объекта, я хотел бы выполнить RejectionHandler.default на нем и получить HttpEntity.

Вот пример того, что я хотел бы сделать:

implicit def myRejectionHandler = 
    RejectionHandler.newBuilder() 
    .handleAll[Rejection] { rejections ⇒ 

    def prefixEntity(entity: ResponseEntity): ResponseEntity = entity match { 
     case HttpEntity.Strict(contentType, data) => { 
     import spray.json._ 
     val text = ErrorResponse(0, "Rejection", data.utf8String).toJson.prettyPrint 
     HttpEntity(ContentTypes.`application/json`, text) 
     } 
     case _ => 
     throw new IllegalStateException("Unexpected entity type") 
    } 

    val route: Route = extractRequestContext { ctx => 
     mapResponseEntity(prefixEntity) { 
     // Here I want result of `complete` route from RejectionHandler.default 
     } 
    } 
    route 
    } 
    .handleNotFound { 
     complete((NotFound, "Not here!")) 
    } 
    .result() 
+0

Можете ли вы предоставить образец кода, показывающий это. Его не нужно компилировать. Мне просто нужно понять поток кода. – cmbaxter

+0

@cmbaxter Добавлено. – expert

ответ

2

Я думаю, что я получаю суть того, что вы хотите. Вы можете просто применить обработчик отклонения по умолчанию там, где есть ваш комментарий. Единственное, что apply возвращает Option, который будет None, если обнаруженные отклонения не ударятся ни о чем в этом обработчике отклонения. Это маловероятно, учитывая, что вы используете обработчик по умолчанию, и он в значительной степени справляется со всем, но вам все равно нужно учитывать его в коде (отсюда мой getOrElse, который приводит к общему InternalServerError). Модифицированный код будет выглядеть следующим образом:

val defaultRejectionHandler = RejectionHandler.default 

implicit def myRejectionHandler = 
    RejectionHandler.newBuilder() 
    .handleAll[Rejection] { rejections ⇒ 

    def prefixEntity(entity: ResponseEntity): ResponseEntity = entity match { 
     case HttpEntity.Strict(contentType, data) => { 
     import spray.json._ 
     val text = ErrorResponse(0, "Rejection", data.utf8String).toJson.prettyPrint 
     HttpEntity(ContentTypes.`application/json`, text) 
     } 
     case _ => 
     throw new IllegalStateException("Unexpected entity type") 
    } 

    val route: Route = extractRequestContext { ctx => 
     mapResponseEntity(prefixEntity) { 
     defaultRejectionHandler.apply(rejections).getOrElse{ 
      complete(StatusCodes.InternalServerError) 
     } 
     } 
    } 
    route 
    } 
    .handleNotFound { 
    complete((NotFound, "Not here!")) 
    } 
    .result() 

компилируется, но я на самом деле не проверить его, чтобы увидеть, если мы получим желаемый эффект. Кроме того, мне не нужно значение RequestContextctx, поэтому вы можете удалить этот слой extractRequestContext.

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

  • Нет связанных вопросов^_^