GWT中使用JavaScript覆盖类型列表的JsonUtils异常

时间:2012-02-03 10:34:55

标签: javascript json gwt

我从Servlet获取JSON字符串,并希望使用JavaScript Overlay Types解析此字符串。

我的整个编码取决于google发布的你的例子 我的目标是将JSON字符串加载到Type Article的ArrayList中。

所以我创建了类JSArray

public class JsArray<E extends JavaScriptObject> extends JavaScriptObject {
    protected JsArray() { }
    public final native int length() /*-{ return this.length; }-*/;
    public final native E get(int i) /*-{ return this[i];     }-*/;
}

类ArticleData

public class ArticleData extends JavaScriptObject {
    protected ArticleData() {}

    public final native String getId() /*-{ return this.id; }-*/;
    public final native String getAmount() /*-{ return this.amount; }-*/;
    public final native String getPct() /*-{ return this.pct; }-*/;
    public final native String getStartAmount() /*-{ return this.startamount; }-*/;
    public final native String getPrice() /*-{ return this.price; }-*/;
    public final native String getStockValue() /*-{ return this.stockvalue; }-*/;
}

在我的EntryPoint中,我按照以下方式开课:

String json = event.getResults();
logger.info(json);

JsArray<ArticleData> cs = getArticles(json);
for (int i = 0, n = cs.length(); i < n; ++i) {
    Window.alert(cs.get(i).getId() + " " + cs.get(i).getPrice());
}

...
private native JsArray<ArticleData> getArticles(String json)/*-{
   return JsonUtils.safeEval(json);
}-*/;

我的JSON文件:

{"articles":[
{"amount":"50","id":"1","pct":"50,00","price":"162,37","startamount":"100","stockvalue":"8118,45"},{"amount":"20","id":"2","pct":"20,00","price":"164,83","startamount":"100","stockvalue":"3296,60"},{"amount":"20","id":"3","pct":"20,00","price":"170,40","startamount":"100","stockvalue":"3408,00"},{"amount":"100","id":"4","pct":"100,00","price":"41,32","startamount":"100","stockvalue":"4132,43"},{"amount":"0","id":"5","pct":"0,00","price":"40,04","startamount":"100","stockvalue":"0,00"}]}

我总是得到这个例外:

  

引起:com.google.gwt.core.client.JavaScriptException:   (ReferenceError):未定义JsonUtils       在com.google.gwt.dev.shell.BrowserChannelServer.invokeJavascript(BrowserChannelServer.java:248)       在com.google.gwt.dev.shell.ModuleSpaceOOPHM.doInvoke(ModuleSpaceOOPHM.java:136)       在com.google.gwt.dev.shell.ModuleSpace.invokeNative(ModuleSpace.java:561)       在com.google.gwt.dev.shell.ModuleSpace.invokeNativeObject(ModuleSpace.java:269)       在com.google.gwt.dev.shell.JavaScriptHost.invokeNativeObject(JavaScriptHost.java:91)       在net.mybecks.gwt.client.XMLParser.getArticles(XMLParser.java)       在net.mybecks.gwt.client.XMLParser.access $ 2(XMLParser.java:92)       at net.mybecks.gwt.client.XMLParser $ 2.onSubmitComplete(XMLParser.java:78)       在com.google.gwt.user.client.ui.FormPanel $ SubmitCompleteEvent.dispatch(FormPanel.java:115)       在com.google.gwt.user.client.ui.FormPanel $ SubmitCompleteEvent.dispatch(FormPanel.java:1)       在com.google.gwt.event.shared.GwtEvent.dispatch(GwtEvent.java:1)

第92行是上面的getArticles方法。

我严格遵循谷歌文档,我没有找到任何有用的结果谷歌异常。只有班级文件。

BR&amp;谢谢, mybecks

2 个答案:

答案 0 :(得分:4)

为什么getArticles()是JSNI方法? JsonUtils是正常的GWT类。

你的方法应该是:

private JsArray<ArticleData> getArticles(String json) {
   return JsonUtils.safeEval(json);
};

答案 1 :(得分:1)

我不是在提倡这种方法,Strelok肯定更好,但你的问题来自于没有明确引用JsonUtils。

private native JsArray<ArticleData> getArticles(String json)/*-{
    return @com.google.gwt.core.client.JsonUtils::safeEval(Ljava/lang/String;)(json);
}-*/

请参阅Calling a Java Method from Handwritten JavaScript