每种错误类型的 PlayFramework Application 2.7.x 自定义错误页面

Posted

技术标签:

【中文标题】每种错误类型的 PlayFramework Application 2.7.x 自定义错误页面【英文标题】:PlayFramework Application 2.7.x Custom Error Page for each type of Error 【发布时间】:2019-12-01 03:42:14 【问题描述】:

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

我在网上找到了这个文档

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 扩展的新方法,我如何根据每种错误类型将我的响应发送到自定义错误页面。

编辑:也许问题不清楚。在错误处理程序中,我想将错误发送到自定义错误页面。这在我可以做的 play 2.3.x 示例中显示

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

我想在 Play 2.7.x 及更高版本中做类似的事情。

【问题讨论】:

【参考方案1】:

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

对于 Bad Request and 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))
    )
  


【讨论】:

但这仍然不是我想要的。我想呈现一个自定义错误页面。在前面的示例中,他们可以使用InternalServerError(views.html.errorPage(exceptions))。这样,所有异常都将转到自定义模板,我可以在其中呈现错误消息。 它仍然不符合我的要求。因为我想要每种类型或错误的自定义错误页面。现在每个错误都将转到同一页面。如何捕获每种类型的错误,然后将其路由到相应的页面。 能否将您要处理的错误添加到问题中?您也可以在 Play 2.3 中发布您的解决方案,我会将其转换为 Play 2.7。 我想分别处理onHandlerNotFound 上的onBadRequestonInternalServerError。所以基本上,我应该能够在从 HTTPErrorHandler 派生的类中捕获这些错误,然后将它们路由到它们各自的模板。 如果我错了,请纠正我。您希望为 404 页面未找到、400 错误请求和 500 内部服务器错误提供自定义播放模板。对吗?

以上是关于每种错误类型的 PlayFramework Application 2.7.x 自定义错误页面的主要内容,如果未能解决你的问题,请参考以下文章

Play framework 2.0.1 不断尝试进化错误的数据库类型

手动调用 PlayFramework 自定义错误页面

如何为每种语言设置不同的路线

数据透视表错误

PlayFramework 之类的中间件

在 Heroku 托管的 Play Framework 2 应用程序上通过 Mandrill 对电子邮件进行错误的内容传输编码。在本地工作