Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在GWT中,何时使用JsonpRequestBuilder在json-p请求中调用AsyncCallback:onFailure方法_Gwt_Servlets_Jsonp_Cxf - Fatal编程技术网

在GWT中,何时使用JsonpRequestBuilder在json-p请求中调用AsyncCallback:onFailure方法

在GWT中,何时使用JsonpRequestBuilder在json-p请求中调用AsyncCallback:onFailure方法,gwt,servlets,jsonp,cxf,Gwt,Servlets,Jsonp,Cxf,我一直在实现一个调用REST服务的GWT应用程序(我们也在开发)。当REST服务返回HTTP状态不是200的任何内容时,我希望调用AsyncCallback的onFailure方法。但是我不能让这一切发生 为了进一步测试它,我创建了一个测试GWT应用程序和一个测试servlet。GWT应用程序调用该服务的部分如下所示: JsonpRequestBuilder jsonp = new JsonpRequestBuilder(); jsonp.setCallbackParam("_jsonp");

我一直在实现一个调用REST服务的GWT应用程序(我们也在开发)。当REST服务返回HTTP状态不是200的任何内容时,我希望调用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");
    }
});
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响应到达时被调用(如果是失败的话)。我想有些事情我还不明白,如果能得到一些帮助,我会非常感激

谢谢,如果加载脚本时出错,则应发送一个
错误事件,GWT不会侦听它(因为几乎没有浏览器实际触发它)。
为了获得最佳浏览器兼容性,最好始终发送200状态,然后调用失败回调(或者换句话说,返回错误状态/条件,而不是抛出异常)


此外,失败回调的参数应该是字符串(将是异常消息)。

从调用REST服务的服务器代码中,如果响应不是200,则自己抛出异常(通过编写代码自己检查响应)。这样,它将作为一个错误持续到客户端,而onFailure将在客户端调用


在GWT看来,目前没有任何问题。它发送了一个请求,得到了一些结果,不管是什么,呼叫成功了。它确实会在超时时调用onFailure,因为请求“物理上”出了问题,GWT将异常作为失败持久化到客户端

谢谢你的回答。你是说无论发生什么错误,onFailure都不会被称为onFailure吗?当你阅读文档时,这不是很清楚。我试图更改服务器,使其返回200,但仍将响应包装在故障回调中。这样做,我在GWT客户端得到一个异常:java.lang.ClassCastException:null在java.lang.Class.cast(Class.java:2990)在com.google.GWT.dev.shell.JsValueGlue.get(JsValueGlue.java:169)在…我是说只有在响应调用onFailure并且浏览器没有触发onerror时才会调用onFailure(如果状态不是200,则将在最新浏览器中发生)。如果您没有将参数更改为字符串,则应在开发模式下进行类转换。非常感谢。现在我明白了。因此,我想我必须始终在响应上设置状态200,并在失败回调中包装异常。如果您要使用i18n,可以传回错误代码/enum,并通过e客户端。而不是在服务器端执行。感谢您的回复。我想指出的是,我从客户端调用REST服务。我示例中的服务器示例是一个非常简单的REST服务。您能给我一个简单的示例,说明如何更改服务器端代码,以便错误持续到客户端吗?我已尝试st添加这样一行:
抛出新的ServletException();
但这在客户端似乎没有任何区别。