遵循docs我能够通过重写 GlobalSettings 类中的方法在我的应用程序中实现自定义错误处理程序:
@Override
public Promise<Result> onBadRequest(RequestHeader request, String error) {
return Promise.<Result> pure(Results.notFound(com.me.project.views.html.pages.ErrorPage
.render(Constants.HTTP_400)));
}
@Override
public Promise<Result> onHandlerNotFound(RequestHeader request) {
return Promise.<Result> pure(Results.notFound(com.me.project.views.html.pages.ErrorPage
.render(Constants.HTTP_404)));
}
@Override
public Promise<Result> onError(RequestHeader request, Throwable t) {
return Promise.<Result> pure(Results.notFound(com.me.project.views.html.pages.ErrorPage
.render(Constants.HTTP_500)));
}
但是我只想将它们用于生产而不是开发,因为浏览器中显示的错误非常有用。
我可以使用以下方法检测应用程序是否处于开发模式:
boolen isDev = play.api.Play.isDev(play.api.Play.current());
但是我无法调用默认错误页面,因为我不知道如何调用。如何调用默认错误页面?我查看了代码here ,但我的 Scala 很差,我似乎无法让它工作。我认为应该在全局对象中移植到 java 的部分是:
private def defaultErrorHandler: HttpErrorHandler = {
Play.maybeApplication.fold[HttpErrorHandler](DefaultHttpErrorHandler) { app =>
app.injector.instanceOf[DefaultHttpErrorHandler]
}
}
和
def onError(request: RequestHeader, ex: Throwable): Future[Result] =
defaultErrorHandler.onServerError(request, ex)
def onHandlerNotFound(request: RequestHeader): Future[Result] =
defaultErrorHandler.onClientError(request, play.api.http.Status.NOT_FOUND)
def onBadRequest(request: RequestHeader, error: String): Future[Result] =
defaultErrorHandler.onClientError(request, play.api.http.Status.BAD_REQUEST, error)
但是我无法移植它,因为诸如 Play.maybeApplication
之类的东西无法解析(它们受到保护吗)?!?
我确信这应该是一件容易的事,但我有点卡住了。
另外,作为旁注,任何人都可以解释这些 docs 的存在吗?这似乎表明错误处理将在 2.4.x 中完全改变:S,我认为这个问题将是短暂的,直到 2.4 发布?
最佳答案
如果您浏览GlobalSettings.java查阅源码,你会发现,onError(RequestHeader request, Throwable t)
和onHandlerNotFound(RequestHeader request)
的默认实现返回null,因此你可以通过这种方式重写这些方法:
if(Play.isDev()){
return null;
} else {
// return promise of result...
}
关于java - 如何在开发模式而非生产模式下调用默认错误页面(Play Framework 2.3.4 - Java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26378810/