我一直在實現一個調用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響應到達時立即被調用(如果是失敗)。我想有些事情我不明白,我真的很感謝能得到一些幫助。
感謝
感謝您的回答。你是否真的在說失敗永遠不會被稱爲無論發生什麼錯誤?閱讀文檔時不太清楚。 我試圖改變服務器,以便它返回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
我在說onFailure只會在響應調用時調用*和*瀏覽器不會觸發onerror(如果狀態爲最新瀏覽器不是200)。如果您沒有將參數更改爲字符串,則需要在開發模式下進行類轉換。 –
非常感謝。現在我懂了。所以我想我將不得不始終將狀態200設置爲我的響應,並在失敗回調中包裝異常。 – Fred