0

この記事に従って、hostpageを使用して配列をクライアントに渡しました。

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 を混乱させると思います。

JsArrayExtImpl<PersonImpl>JSNI メソッドを直接呼び出すため、 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 に答える