Как создать глобальный пользовательский интерфейс для просмотра страниц с ошибками 404/505 с помощью Play?
Создание настраиваемой страницы ошибок 404/500 в Play Framework
Ответ 1
В Play Framework 1 вам просто нужно изменить предоставленные app/views/errors/404.html
и app/views/errors/500.html
.
Ответ 2
Обработка ошибок изменена в 2.5.x. Теперь вам понадобится ErrorHandler для обработки ошибок и отображения собственных страниц ошибок.
Документация для 2.5.x говорит:
Предоставление настраиваемого обработчика ошибок
import play.api.http.HttpErrorHandler
import play.api.mvc._
import play.api.mvc.Results._
import scala.concurrent._
import javax.inject.Singleton;
@Singleton
class ErrorHandler extends HttpErrorHandler {
def onClientError(request: RequestHeader, statusCode: Int, message: String) = {
Future.successful(
Status(statusCode)("A client error occurred: " + message)
)
}
def onServerError(request: RequestHeader, exception: Throwable) = {
Future.successful(
InternalServerError("A server error occurred: " + exception.getMessage)
)
}
}
Вы можете найти страницы ошибок по умолчанию для Github: https://github.com/playframework/playframework/tree/master/framework/src/play/src/main/scala/views/defaultpages
Подробнее см. https://www.playframework.com/documentation/2.5.x/ScalaErrorHandling.
Ответ 3
В документации для 2.3.x:
Предоставление страницы с сообщением об ошибке
Когда в приложении появляется исключение, вызывается операция onError. По умолчанию используется страница с внутренней картой:
import play.api._
import play.api.mvc._
import play.api.mvc.Results._
import scala.concurrent.Future
object Global extends GlobalSettings {
override def onError(request: RequestHeader, ex: Throwable) = {
Future.successful(InternalServerError(
views.html.errorPage(ex)
))
}
}
Источник: https://www.playframework.com/documentation/2.3.x/ScalaGlobal#Providing-an-application-error-page
Не найдено (404) Страница ошибки
Вам понадобится обработчик onHandlerNotFound
рядом с вышеперечисленным обработчиком onError
:
override def onHandlerNotFound(request: RequestHeader) = {
Future.successful(NotFound(views.html.errors.notFoundPage()))
}
Источник: это не документировано, но смотрите в определении определения GlobalSettings
.
Источник шаблона страницы ошибки по умолчанию
Источником шаблона ошибки по умолчанию для версии 2.3.x можно прочитать здесь:
Ответ 4
Вы можете использовать это:
import javax.inject.{Inject, Singleton}
import play.api.http.DefaultHttpErrorHandler
import play.api.mvc.Results._
import play.api.mvc.{RequestHeader, Result}
import scala.concurrent.{ExecutionContext, Future}
@Singleton
class ErrorHandler @Inject()(implicit executionContext:ExecutionContext) extends DefaultHttpErrorHandler{
override def onServerError(request: RequestHeader, exception: Throwable): Future[Result] = {
exception match {
case e:scala.MatchError => Future(Ok("Page Not Found"))
case _ => Future(Ok("Internal Server Error :("))
}
}
}