每种错误类型的 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
但这与旧的错误处理程序不同。过去我可以处理onHandlerNotFound
和onBadRequest
和onInternalServerError
但现在我只能处理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
上的onBadRequest
和onInternalServerError
。所以基本上,我应该能够在从 HTTPErrorHandler 派生的类中捕获这些错误,然后将它们路由到它们各自的模板。
如果我错了,请纠正我。您希望为 404 页面未找到、400 错误请求和 500 内部服务器错误提供自定义播放模板。对吗?以上是关于每种错误类型的 PlayFramework Application 2.7.x 自定义错误页面的主要内容,如果未能解决你的问题,请参考以下文章
Play framework 2.0.1 不断尝试进化错误的数据库类型
在 Heroku 托管的 Play Framework 2 应用程序上通过 Mandrill 对电子邮件进行错误的内容传输编码。在本地工作