在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获得释放?
答案 0 :(得分:2)
如果您浏览GlobalSettings.java来源,您会发现,onError(RequestHeader request, Throwable t)
和onHandlerNotFound(RequestHeader request)
的默认实现会返回null,因此您可以通过以下方式覆盖这些方法:
if(Play.isDev()){
return null;
} else {
// return promise of result...
}