具有类型化响应的 JsonpRequestBuilder 抛出 InCompatibleClassChangeError
JsonpRequestBuilder with typed response throws InCompatibleClassChangeError
我有一个现有的应用程序,我正在向其添加 "Suggested Products" 功能,但我遇到了 JSONP 响应未正确转换为类型化 JsArray 的问题。我希望有人能告诉我我做错了什么?
我已经定义了将从服务器返回的类型 class:
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: Found interface
com.google.gwt.cor.client.JsArray, but class was expected
我一直在关注 guide in the GWT documentation。我看不出我正在尝试的和他们所说的有什么区别。当我调试时,返回的数据看起来好像是一个 SuggestedProducts 数组,所以我不知道如何继续。任何帮助,将不胜感激。
经过仔细检查,我意识到我的覆盖类型缺少方法主体,用于从它们所代表的 JSON 对象中 return 的哪些字段。解决方法是包含正确的 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; }-*/;
}
我有一个现有的应用程序,我正在向其添加 "Suggested Products" 功能,但我遇到了 JSONP 响应未正确转换为类型化 JsArray 的问题。我希望有人能告诉我我做错了什么?
我已经定义了将从服务器返回的类型 class:
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: Found interface com.google.gwt.cor.client.JsArray, but class was expected
我一直在关注 guide in the GWT documentation。我看不出我正在尝试的和他们所说的有什么区别。当我调试时,返回的数据看起来好像是一个 SuggestedProducts 数组,所以我不知道如何继续。任何帮助,将不胜感激。
经过仔细检查,我意识到我的覆盖类型缺少方法主体,用于从它们所代表的 JSON 对象中 return 的哪些字段。解决方法是包含正确的 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; }-*/;
}