Gwt 带有类型化响应的JsonpRequestBuilder引发不兼容的ClassChangeError

Gwt 带有类型化响应的JsonpRequestBuilder引发不兼容的ClassChangeError,gwt,jsonp,Gwt,Jsonp,我有一个正在添加建议产品功能的现有应用程序,我的JSONP响应没有正确转换为类型化JsArray,这使我遇到了麻烦。我希望有人能告诉我我做错了什么 我已定义了将从服务器在其自己的类中返回的类型: import com.google.gwt.core.client.JavaScriptObject; public class SuggestedProduct extends JavaScriptObject { protected SuggestedProduct() {} pu

我有一个正在添加建议产品功能的现有应用程序,我的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.CompatibleClassChangeError:找到接口 com.google.gwt.cor.client.JsArray,但应为类


我一直在跟踪调查。我看不出我所尝试的和他们所说的有什么不同。当我调试时,返回的数据似乎是一个SuggestedProducts数组,因此我很难理解如何继续。任何帮助都将不胜感激

仔细检查后,我意识到我的覆盖类型缺少从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; }-*/;
}

您可以共享堆栈跟踪的其余部分吗?还有,里面有一个奇怪的打字错误,让我觉得可能还有其他错误-实际的错误是什么样子的?您还可以澄清您使用的是传统开发模式而不是超级开发模式,以及您使用的是哪个版本的GWT吗?在您的评论之后,我仔细查看了完整的堆栈跟踪,并意识到引发了另一个异常。根本问题是我的覆盖类型SuggestedProduct的方法声明格式不正确。它们是JSNI方法,不告诉在实际javascript中应该返回哪些字段。您的评论帮助我意识到,谢谢@Colin AlworthWith no return语句,JS函数默认返回未定义的,GWT将其解释为null。也就是说,如果这是新的代码,请考虑使用JSRICOP代替JSNI,它将将来证明您的应用程序。谢谢您的建议。我会调查的。我正在努力让我们完全远离GWT,但没有理由不把事情做得更好