带有类型响应的JsonpRequestBuilder抛出InCompatibleClassChangeError

时间:2018-05-17 17:21:41

标签: gwt jsonp

我有一个现有的应用程序,我正在添加一个"推荐产品"功能和我的JSONP响应无法正确转换为键入的JsArray。我希望有人能让我知道我做错了什么?

我已经定义了将从其自己的类中的服务器返回的类型:

import com.google.gwt.core.client.JavaScriptObject;

public class SuggestedProduct extends JavaScriptObject {
    protected SuggestedProduct() {}
    public final native String getFormName();
    public final native String getImageURL();
}

我有一个方法,它使用JsonpRequestBuilder来触发获取我的JSON的请求。

private void loadSuggestedProducts() {
        JsonpRequestBuilder builder = new JsonpRequestBuilder();
        builder.requestObject(buildSuggestedProductURL(), new AsyncCallback<JsArray<SuggestedProduct>>() {
            public void onFailure(Throwable caught) {
                //Handle errors
            }

            public void onSuccess(JsArray<SuggestedProduct> data) {
                if ( data == null) {
                    //Handle empty data
                    return;
                }
                SafeHtmlBuilder sb = new SafeHtmlBuilder();
                sb.appendHtmlConstant("<h4>Suggested Products:</h4>");
                for (int i=0; i < data.length(); i++) {
                    SuggestedProduct product = data.get(i); //<- This line throws the exception
                    sb.appendHtmlConstant("<div class=\"card\">");
                    sb.appendHtmlConstant("<img class=\"card-img-top\" src=\"" + product.getImageURL() + "\" alt=\"" + product.getFormName() + "\">");
                    sb.appendHtmlConstant("<div class=\"card-body\">");
                    sb.appendHtmlConstant("<h5 class=\"card-title\">" + product.getFormName() + "</h5>");
                    sb.appendHtmlConstant("<a onclick=\"javascript:addItems();\" class=\"cmd-add\">Add <i aria-hidden=\"true\" class=\"fa fa-plus-circle\"></i></a>");
                    sb.appendHtmlConstant("</div></div>");                  
                }
                view.getSuggestedProducts().setInnerSafeHtml(sb.toSafeHtml());
                }
            });
}

当我尝试使用响应中的SuggestedProduct时,出现错误:

  

java.lang.IncompatibleClassChangeError:找到的接口   com.google.gwt.cor.client.JsArray,但预计会上课

我一直关注guide in the GWT documentation。我没有看到我尝试的内容与他们所说的内容之间的区别。当我调试时,看起来好像返回的数据是一个SuggestedProducts数组,所以我很难知道如何继续。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:1)

经过仔细检查后,我发现我的叠加类型缺少方法体,用于从它们所代表的JSON对象返回哪些字段。解决方法是包含正确的JSNI方法定义。

import com.google.gwt.core.client.JavaScriptObject;

public class SuggestedProduct extends JavaScriptObject {
    protected SuggestedProduct() {}
    public final native String getFormName() /*-{ return this.formname; }-*/;
    public final native String getImageURL() /*-{ return this.imageurl; }-*/;
}