PlayFramework 应用程序 2.7.x 每种错误类型的自定义错误页面

PlayFramework Application 2.7.x Custom Error Page for each type of Error

当控制器 returns 出现 InternalServerError 时,我想要一个自定义页面以用户友好的方式呈现错误消息。

我在 Internet 上找到了这个文档

https://www.playframework.com/documentation/2.3.x/ScalaGlobal

现在我明白上面的 URL 对 Playframework 2.7 不再有效。我搜索了更多,发现了这个

https://www.playframework.com/documentation/2.7.x/ScalaErrorHandling

但这与旧的错误处理程序不同。过去我可以处理 onHandlerNotFoundonBadRequestonInternalServerError 但现在我只能处理 onServerError

使用从 HttpErrorHandler 扩展的新方法如何根据每种错误类型将我的响应发送到自定义错误页面。

编辑:可能问题没说清楚。在错误处理程序中,我想将错误发送到自定义错误页面。这显示在播放 2 的示例中。3.x 我可以做的地方

object Global extends GlobalSettings {
  override def onError(request: RequestHeader, ex: Throwable) = {
    Future.successful(InternalServerError(
      views.html.errorPage(ex)
    ))
  }
}

我想在游戏 2 中做类似的事情。7.x 及以后。

如果您想为未处理的异常提供自定义错误页面,就像在 Play 2.3 中使用 onError 方法一样,在 Play 2.7 中实现 ErrorHandler.onServerError 方法。

对于 Bad Request 和 Not Found 以及其他客户端错误,有 ErrorHandler.onClientError 方法可以实现,允许根据状态代码返回自定义模板。

import javax.inject.Singleton
import play.api.http.DefaultHttpErrorHandler
import play.api.http.Status._
import play.api.mvc.Results._
import play.api.mvc._
import scala.concurrent._

@Singleton
class ErrorHandler extends DefaultHttpErrorHandler {

  override def onClientError(request: RequestHeader, statusCode: Int, message: String): Future[Result] = {
    statusCode match {
      case NOT_FOUND => Future.successful(NotFound(views.html.notFound()))
      case BAD_REQUEST => Future.successful(BadRequest(views.html.badRequest()))
      case _ => super.onClientError(request, statusCode, message)
    }
  }

  override def onServerError(request: RequestHeader, ex: Throwable): Future[Result] = {
    Future.successful(
      InternalServerError(views.html.errorPage(ex))
    )
  }

}