播放2.2.1 Scala - 重定向413 REQUEST_ENTITY_TOO_LARGE

时间:2014-02-17 14:33:07

标签: scala request playframework-2.2 maxlength

我有以下控制器操作作为表单解析器:

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

我知道我可以更改此操作的最大长度值,但我想要做的是当用户输入太多文本时将用户返回到表单并返回一条很好的错误消息。 如果请求正文超过了默认的最大长度,我将获得一个完整的空白页面,并且只有浏览器控制台显示“413(请求实体太大)”。我试图在我的全局对象中捕获此错误,但这并没有改变任何东西。在我看来,当解析器发回一个errorpage时,不会输入全局onError触发器。还是一个空白页面。我也尝试在操作中捕获该错误,但在我看来,没有输入操作代码,因为正文解析器已经抛出了这个空白的错误页面。

当正文超过最大长度时,有没有办法将用户发送回表单操作?

1 个答案:

答案 0 :(得分: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) => {
      ...
    }
  })
}