Создание настраиваемой страницы ошибок 404/500 в Play Framework

Как создать глобальный пользовательский интерфейс для просмотра страниц с ошибками 404/505 с помощью Play?

Ответ 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 можно прочитать здесь:

https://github.com/playframework/playframework/blob/2.3.x/framework/src/play/src/main/scala/views/defaultpages/error.scala.html

Ответ 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 :("))

}

}


}