2012-01-26 21 views
0

我一直在實現一個調用REST服務(我們也在開發)的GWT應用程序。當REST服務返回的HTTP狀態不是200時,我會期望調用AsyncCallback的onFailure方法。但是我無法讓這發生。在GWT中,什麼時候是使用JsonpRequestBuilder在json-p請求中調用的AsyncCallback:onFailure方法

爲了進一步測試,我創建了一個測試GWT應用程序和一個測試servlet。在GWT應用程序調用該服務的部分看起來像這樣:

JsonpRequestBuilder jsonp = new JsonpRequestBuilder(); 
jsonp.setCallbackParam("_jsonp"); 
jsonp.setFailureCallbackParam("_jsonp_failure"); 

jsonp.requestObject(url, new AsyncCallback<JavaScriptObject>() 
{ 

    @Override 
    public void onFailure(Throwable caught) 
    { 
     Window.alert("Failure: " + caught.getMessage()); 
    } 

    @Override 
    public void onSuccess(JavaScriptObject result) 
    { 
     Window.alert("Success"); 
    } 
}); 

該servlet代碼看起來是這樣的:

public class MyRestServlet extends HttpServlet 
{ 
    protected void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws ServletException, IOException 
    { 
     String padding = httpServletRequest.getParameter("_jsonp_failure"); 
     httpServletResponse.setContentType("application/x+javascript"); 
     httpServletResponse.setStatus(500); 


     PrintWriter out = httpServletResponse.getWriter(); 
     out.println(padding + "({\"some\":\"json\"});"); 
     out.close(); 
    } 
} 

onFailure處最終被調用時,請求超時,但我希望它會在http響應到達時立即被調用(如果是失敗)。我想有些事情我不明白,我真的很感謝能得到一些幫助。

感謝

回答

1

According to HTML5,如果有加載腳本錯誤時,error事件應該被送去了,GWT不爲它聽(因爲幾乎沒有瀏覽器實際上觸發它AFAICT)。
爲了獲得最佳的瀏覽器兼容性,您最好始終發送200狀態,但隨後調用故障回調(或換句話說,返回錯誤狀態/條件,而不是拋出異常)。

此外,失敗回調的參數應該是一個字符串(將是異常的消息)。

+0

感謝您的回答。你是否真的在說失敗永遠不會被稱爲無論發生什麼錯誤?閱讀文檔時不太清楚。 我試圖改變服務器,以便它返回200,但仍然包裹在故障回調中的響應。這樣做我在GWT客戶端得到一個異常: java.lang.ClassCastException:null at java.lang.Class.cast(Class.java:2990) at com.google.gwt.dev.shell.JsValueGlue .get(JsValueGlue.java:169) at ... – Fred

+0

我在說onFailure只會在響應調用時調用*和*瀏覽器不會觸發onerror(如果狀態爲最新瀏覽器不是200)。如果您沒有將參數更改爲字符串,則需要在開發模式下進行類轉換。 –

+0

非常感謝。現在我懂了。所以我想我將不得不始終將狀態200設置爲我的響應,並在失敗回調中包裝異常。 – Fred

0

從調用REST服務的服務器代碼中,如果響應不是200(通過編寫代碼自行檢查響應),則自己拋出異常。這種方式會持續到客戶端作爲錯誤,onFailure將在客戶端調用。

在GWT的頭腦中,目前沒有任何問題。它發出了一個請求,得到了一些結果並不重要,通話成功了。它會在超時時調用onFailure,因爲某些事情在物理上發生了錯誤,並且GWT將異常作爲失敗持續保留在客戶端。

+0

感謝您的回覆。我想指出的是,我從客戶端調用REST服務。我的示例中的服務器示例是一個非常簡單的REST服務。你能告訴我一個簡單的例子,如何改變我的服務器端代碼,以便錯誤會持續到客戶端?我試圖添加一行像這樣: '拋出新的ServletException();' 但這似乎沒有任何區別在客戶端。 – Fred

相關問題