JsonpRequestBuilder с типизированными ответными бросками InCompatibleClassChangeError - PullRequest
0 голосов
/ 17 мая 2018

У меня есть существующее приложение, в которое я добавляю функцию «Предлагаемые продукты», и у меня возникают проблемы с неправильным преобразованием ответа 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());
                }
            });
}

Когда я пытаюсь использовать Предлагаемый продукт из ответа, я получаю ошибку:

java.lang.IncompatibleClassChangeError: найден интерфейс com.google.gwt.cor.client.JsArray, но ожидался класс

Я следовал руководству в документации GWT .Я не вижу разницы между тем, что я пытаюсь, и тем, что, по их словам, сработает.Когда я отлаживаю, это выглядит так, как будто возвращенные данные являются массивом Предлагаемых продуктов, поэтому я не знаю, как действовать дальше.Любая помощь будет оценена.

1 Ответ

0 голосов
/ 21 мая 2018

После более тщательной проверки я понял, что в моем типе наложения отсутствуют тела методов для полей, которые нужно вернуть из объекта 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; }-*/;
}
...