如何在开发模式下调用默认错误页面而不是生产(Play Framework 2.3.4 - Java)

时间:2014-10-15 09:17:01

标签: java playframework

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获得释放?

1 个答案:

答案 0 :(得分:2)

如果您浏览GlobalSettings.java来源,您会发现,onError(RequestHeader request, Throwable t)onHandlerNotFound(RequestHeader request)的默认实现会返回null,因此您可以通过以下方式覆盖这些方法:

if(Play.isDev()){
    return null;
} else {
    // return promise of result...
}