2014-02-17 3 views
1

У меня есть следующие действия контроллера, как форма почтового распознаватель:Play 2.2.1 Scala - Перенаправление для 413 REQUEST_ENTITY_TOO_LARGE

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)) 
      } 
     } 
    ) 
    } 
    } 
} 

Я знаю, что я могу изменить максимальное значение длины для этого действия, но то, что я хотел бы do отправляет пользователя обратно в форму с хорошим сообщением об ошибке, когда он вводит слишком много текста. Если тело запроса превышает максимальную длину по умолчанию, я получаю полностью пустую страницу, и только консоль браузера показывает «413 (Request Entity Too Large)». Я попытался поймать эту ошибку в моем глобальном объекте, но это ничего не изменило. Мне кажется, что глобальный триггер onError не вводится, когда парсер отправляет обратно страницу с ошибкой. Еще пустая страница. Я также попытался поймать эту ошибку внутри действия, но мне кажется, что код действия не введен, потому что парсер тела уже выбрасывает эту пустую страницу ошибок.

Есть ли способ отправить пользователя в действие формы, когда тело превышает максимальную длину?

ответ

2

Что-то, как это должно работать для вас:

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) => { 
     ... 
    } 
    }) 
} 
+0

Awesome, спасибо :) – MeiSign

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