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