В GWT, когда метод AsyncCallback: onFailure вызывается в запросе json-p с использованием JsonpRequestBuilder - PullRequest
0 голосов
/ 26 января 2012

Я внедряю приложение GWT, которое вызывает REST-сервис (который мы также разрабатываем).Когда REST-сервис возвращает что-либо с HTTP-статусом, отличным от 200, я ожидаю, что будет вызван метод onFailure AsyncCallback.Однако я не могу этого добиться.

Для дальнейшей проверки я создал тестовое приложение GWT и тестовый сервлет.Часть приложения 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");
    }
});

Код сервлета выглядит следующим образом:

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 поступит (если это сбой).Я предполагаю, что есть кое-что, чего я не понял, и я был бы очень признателен за помощь.

Спасибо

Ответы [ 2 ]

1 голос
/ 26 января 2012

Согласно HTML5 , если при загрузке скрипта произошла ошибка, должно быть отправлено событие error, и GWT его не прослушивает (поскольку фактически ни один браузер на самом деле не запускает его AFAICT).
Для лучшей совместимости с браузером лучше всегда отправлять статус 200, но затем вызывать callback с ошибкой (или, другими словами, возвращать состояние / условие ошибки, а не выдавать исключение).

Также ожидается, что аргументом для обратного вызова сбоя будет строка (будет сообщением об исключении).

0 голосов
/ 27 января 2012

Из кода сервера, на который вы вызываете службу REST, создайте исключение самостоятельно, если ответ не равен 200 (написав код, чтобы проверить ответ самостоятельно). Таким образом, он будет сохраняться на стороне клиента как ошибка, а onFailure будет вызываться на стороне клиента.

В настоящее время, по мнению GWT, все пошло не так. Он отправил запрос, получил какой-то результат, не смотря ни на что, звонок был успешным. Он вызывает onFailure по тайм-ауту, потому что что-то пошло не так с запросом «физически», и GWT сохранил исключение на стороне клиента как сбой.

...