Обратите внимание, что на самом деле нужно решить две разные проблемы:
Отображение пользовательской страницы 404, когда "обработчик не найден", например когда пользователь переходит на недопустимый URL-адрес и
Отображение пользовательской страницы 404 (NotFound) в качестве действительного результата существующего обработчика.
Я думаю, что OP имел в виду # 2, но ответы ссылались на # 1.
Сценарий "Не найден обработчик"
В первом сценарии для «не найден обработчик» (т. Е. Недействительный URL-адрес) другие ответы имеют право, но, если быть более подробным, в документации Play 2.1 как:
Шаг 1: добавить пользовательский глобальный объект:
import play.api._
import play.api.mvc._
import play.api.mvc.Results._
object Global extends GlobalSettings {
override def onHandlerNotFound(request: RequestHeader): Result = {
NotFound(
views.html.notFoundPage(request.path)
)
}
}
Шаг 2: добавьте шаблон. Вот мой:
@(path: String)
<html>
<body>
<h1>Uh-oh. That wasn't found.</h1>
<p>@path</p>
</body>
</html>
Шаг 3: настройте файл conf / application.conf, чтобы он ссылался на ваш новый "Global" Я положил его в пакет контроллеров, но это не обязательно должно быть:
...
application.global=controllers.Global
Шаг 4: перезапустите и перейдите по неверному URL.
Сценарий "Настоящий обработчик не может найти объект"
Во втором сценарии существующий обработчик хочет показать пользовательский 404. Например, пользователь запросил объект "1234", но такого объекта не существует. Хорошей новостью является то, что сделать это обманчиво просто:
Вместо Ok (), окружите ваш ответ NotFound ()
Например:
object FruitController extends Controller {
def showFruit(uuidString: String) = Action {
Fruits.find(uuidString) match {
case Some(fruit) => Ok(views.html.showFruit(fruit))
// NOTE THE USE OF "NotFound" BELOW!
case None => NotFound(views.html.noSuchFruit(s"No such fruit: $uuidString"))
}
}
}
Что мне нравится в этом, так это чистое разделение кода состояния (200 против 404) и возвращенного HTML-кода (showFruit против noSuchFruit).
НТН
Андрей