Playframework 在Global.java中未调用重写的onHandlerNotFound

Playframework 在Global.java中未调用重写的onHandlerNotFound,playframework,playframework-2.0,Playframework,Playframework 2.0,我正在尝试覆盖play framework 2.1.1中处理错误的默认行为,但404有问题,基本上我覆盖的onHandlerNotFound似乎没有被调用。当我访问一个不存在的页面时,会返回一个空白页面。有人知道我做错了什么吗?下面是我的Global.java import play.GlobalSettings; import play.mvc.Http.RequestHeader; import play.mvc.Result; import play.mvc.Results; import

我正在尝试覆盖play framework 2.1.1中处理错误的默认行为,但404有问题,基本上我覆盖的onHandlerNotFound似乎没有被调用。当我访问一个不存在的页面时,会返回一个空白页面。有人知道我做错了什么吗?下面是我的Global.java

import play.GlobalSettings;
import play.mvc.Http.RequestHeader;
import play.mvc.Result;
import play.mvc.Results;
import views.html.error;


public class Global extends GlobalSettings {

    @Override
    public Result onHandlerNotFound(RequestHeader request) {
        return Results.notFound(error.render());
    }

    @Override
    public Result onError(RequestHeader request, Throwable t) {
        return Results.internalServerError(error.render());
    }
}
顺便说一下,onError覆盖正在工作。
谢谢

您的代码是有效的并且可以工作,但是这种行为应该是由浏览器引起的。我使用您的代码测试了这一点,转到Firefox中不存在的页面,错误页面被呈现并显示出来

当我尝试使用Internet Explorer时,它会断开(空页)

解决方案相对简单,使用
ok
而不是
notFound

@Override
public Result onHandlerNotFound(RequestHeader request) {
    return Results.ok(error.render());
}

对于一个
badRequest
,我没有测试任何其他的。

好的,所以本例中的问题是资产的路由已更改为

GET     /*file                      controllers.Assets.at(path="/public", file)
将其更改回默认值

GET     /assets/*file               controllers.Assets.at(path="/public", file)

让它再次发挥作用。我不完全理解它为什么停止工作,有人能解释一下吗?

如果你还在寻找答案,我认为这应该会有所帮助

@Override
public Promise<SimpleResult> onHandlerNotFound(RequestHeader request) {
    return Promise.<SimpleResult>pure(notFound(
            views.html.notFoundPage.render(request.uri())
    ));
}
@覆盖
公共承诺onHandlerNotFound(请求头请求){
返回承诺。纯(未找到)(
views.html.notFoundPage.render(request.uri())
));
}

我遇到了这个问题,我正在使用play 2.3.4,我的解决方案是明确地说
结果。notFound(…)
而不仅仅是
notFound(…)

这是我的功能

@Override
public F.Promise<Result> onHandlerNotFound(Http.RequestHeader request) {
    return F.Promise.<Result>pure(Results.notFound(views.html.notfoundPage.render(request.uri())));
}
@覆盖
公共F.Promise onHandlerNotFound(Http.RequestHeader请求){
返回F.Promise.pure(Results.notFound(views.html.notfoundPage.render(request.uri()));
}

更改后,不要忘记清理项目(
play clean,或activator clean
)。

不幸的是,它仍然不起作用。即使我将return语句更改为ok(error.render())。未调用实际的方法。发生404时不会呈现任何页面-只有一个带有404响应代码的空白屏幕。对于与路由文件中的任何规则都不匹配的请求,将调用Global.onHandlerNotFound()方法。好的,通过从路由中删除“assets/”部分,您告诉Play通过默认的assets控制器处理任何请求(与以前的路由不匹配)。因此,您期望404的请求实际上是通过Assets controller进行的,显然,如果找不到静态资产,它只返回一个404,没有任何内容。