Zagraj w 2.2.1 Scala - Przekierowanie dla 413 REQUEST_ENTITY_TOO_LARGE

Mam następującą akcję kontrolera jako narzędzie do rozpoznawania postów w formularzu:

def importCompletionsSubmit(indexName: String)  = AuthenticatedAction {
  Action.async {
    implicit request => {
      completionsForm.bindFromRequest().fold(
        errors => Future.successful(Ok(html.crudindex.importCompletionsForm(indexName, errors))),
        completions => {
          val autoCompletionService = new AutoCompletionService(new Elasticsearch)
          autoCompletionService.importCompletions(indexName, completions.text) map {
            result: BulkImportResult =>
              if (result.error) Redirect(routes.ListIndices.index(Option.empty[String])).flashing("error" -> Messages("error.bulkItemsFailed", result.failures))
              else Redirect(routes.ListIndices.index(Option.empty[String])).flashing("success" -> Messages("success.completionsAdded", result.requests))
          }
        }
      )
    }
  }
}

Wiem, że mogę zmienić maksymalną długość tej akcji, ale chciałbym odesłać użytkownika z powrotem do formularza z komunikatem o błędzie, gdy wprowadzi za dużo tekstu. Jeśli treść żądania przekracza domyślną maksymalną długość, otrzymuję całkowicie pustą stronę i tylko konsola przeglądarki pokazuje „413 (zbyt duża jednostka żądania)”. Próbowałem wychwycić ten błąd w moim obiekcie globalnym, ale to niczego nie zmieniło. Wydaje mi się, że globalny wyzwalacz onError nie jest wprowadzany, gdy parser odsyła stronę błędu. Wciąż pusta strona. Próbowałem także wychwycić ten błąd wewnątrz akcji, ale wydaje mi się, że kod akcji nie został wprowadzony, ponieważ analizator treści już wyrzuca tę pustą stronę błędu.

Czy istnieje sposób na odesłanie użytkownika z powrotem do akcji formularza, gdy treść przekracza maksymalną długość?


person MeiSign    schedule 17.02.2014    source źródło


Odpowiedzi (1)


Coś takiego powinno zadziałać dla Ciebie:

def test = Action.async(parse.maxLength(1024, parse.multipartFormData)) { implicit request =>
  Future(request.body match {
    case Left(MaxSizeExceeded(length)) => Ok(your_pretty_error_page.scala.html)
    case Right(body) => {
      ...
    }
  })
}
person serejja    schedule 17.02.2014
comment
Wspaniale! Dziękuję :) - person MeiSign; 18.02.2014