我有一个现有的应用程序,我正在添加一个"推荐产品"功能和我的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数组,所以我很难知道如何继续。任何帮助,将不胜感激。
答案 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; }-*/;
}