0

我按照这篇文章使用主机页将数组传递给客户端:

https://developers.google.com/web-toolkit/articles/dynamic_host_page   

目前,我可以在firebug中看到关注内容

<html style="overflow: hidden;">
<head>
......
    <script type="text/javascript">
       var rcmdFriends=[{"Name":"Friend-0","Image":"url"}];
    </script>
</head>
......
</html>

然后我尝试使用这些代码从主机页面获取 js 变量(实际上是一个 json 数组)并将其打印给用户:

    //get array from host page
private native JsArrayExt<People> getRecommendedFriends()/*-{
    return $wnd.rcmdFriends;
}-*/;

@Override
public void onModuleLoad()
{
    final FlowPanel fPanel = new FlowPanel();
    JsArrayExt<People> channels = getRecommendedFriends();
    for (int i = 0, len = channels.length(); i < len; i++)
    {
                 //"print" name to user
         fPanel.add(new Label(channels.get(i).getName()));
    }
    RootPanel.get().add(fPanel);
}

    //model definition
    @SingleJsoImpl(PeopleImpl.class)
    public interface People extends HasName
    {
        String getImage();
        void setImage(String Image);
    }   

但是得到了这个错误:

java.lang.ClassCastException: com.google.gwt.core.client.JavaScriptObject$ cannot be cast to com.pkg.People

奇怪的是,我已经可以看到“通道”的长度是 1,为什么会出现这个转换错误?如何解决这个问题?

4

2 回答 2

1

您不能转换为普通的 Java pojo。您必须实现覆盖类型

public class PersonJSON extends JavaScriptObject {

    protected PersonJSON() {
    }

    public final native String getName() /*-{
        return this.Name;
    }-*/;

    public final native String getImage() /*-{
        return this.Image;
    }-*/;
}

然后你可以打电话

JsArray<PersonJSON> channels = getRecommendedFriends();

并从 PersonJSON 元素中读出值;

于 2012-12-05T09:25:59.320 回答
0

假设JsArrayExt为什么我不能为覆盖类型轻量级集合定义接口?,我想您不使用显式 JSO 子类这一事实会混淆 DevMode。

因为您直接调用了 JSNI 方法,所以我不明白您为什么不使用JsArrayExtImpl<PersonImpl>我认为 Just Work™ 的方法;在这里使用接口没有意义。

如果你真的不能让它工作,我建议使用 AutoBeans 代替(不幸的是它需要在 DevMode: 中进行一个小的序列化/解析舞蹈AutoBeanCodex.decode(factory, Person.class, new JSONObject(rawJso).toString()),而在 prod 模式下你可以简单地使用AutoBeanCodex.decode(factory, Person.class, (JsoSplittable) rawJso))。在您的情况下,它需要另一个舞蹈,因为您使用数组作为对象;请参阅GWT Autobean - 如何处理列表?

于 2012-12-05T10:23:06.580 回答