2013-06-04 57 views
3

我試圖覆蓋處理錯誤在播放框架2.1.1的默認行爲,但我有404s的問題,基本上我重寫的onHandlerNotFound似乎不是被稱爲。當我訪問不存在的頁面時,會返回空白頁面。有誰知道我做錯了什麼?我的Global.java低於覆蓋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覆蓋工作正常。 謝謝

回答

3

OK,所以在這種情況下,問題是,對資產的路線已改變爲

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

改變回的

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

默認使它重新工作。我不完全明白爲什麼停止工作,任何人都可以解釋?

+3

對於與路由文件中的任何規則不匹配的請求,將調用Global.onHandlerNotFound()方法。那麼,通過刪除您告訴Play通過默認資產控制器處理任何請求(與先前路由不匹配)的路由中的「資產/」部分。因此,您對404期望的請求實際上是通過資產控制器進行的,顯然,如果它沒有找到靜態資產,它就會返回一個沒有內容的404。 – estmatic

+0

瞭解,謝謝。 –

2

您的代碼是有效的,但行爲應該是由瀏覽器引起的。我使用你的代碼測試了這一點,並轉到Firefox中的一個不存在的頁面,並且顯示並顯示了錯誤頁面。

當我嘗試使用Internet Explorer時,它會中斷(空白頁)。

的解決方法是比較簡單,使用ok,而不是notFound

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

這同樣適用於一個badRequest,我沒有測試過任何人。

+0

不幸的是,它仍然無法正常工作。即使我將return語句更改爲ok(error.render())。實際的方法沒有被調用。發生404時不會顯示任何頁面 - 只是帶有404響應代碼的空白屏幕。 –

0

如果你仍然在尋找答案,我認爲這應該有所幫助。

@Override 
public Promise<SimpleResult> onHandlerNotFound(RequestHeader request) { 
    return Promise.<SimpleResult>pure(notFound(
      views.html.notFoundPage.render(request.uri()) 
    )); 
} 
1

我有這個問題,我使用的播放2.3.4,對我來說,解決辦法是明確地說Results.notFound(...),而不是僅僅notFound(...)

這裏是我的功能

@Override 
public F.Promise<Result> onHandlerNotFound(Http.RequestHeader request) { 
    return F.Promise.<Result>pure(Results.notFound(views.html.notfoundPage.render(request.uri()))); 
} 

請勿在此更改後,請FORGET清理您的項目(play clean, or activator clean)。