1

AutoBeanを使用してデータを JSON にコーディング/デコードしますが、以前の GWT バージョンでは問題ありませんでした。私の意見では、AutoBean は JSON を処理するための非常に優れた便利なツールです。GWT ver.2.4.0 以降、この機能が変更されたので、時間をかけてコードで復元しました。ただし、まだ修正されていない部分は 1 つだけです - アノテーション @PropertyName です。この注釈は、プロパティに「エイリアス」を追加するために使用されます。これにより、多くのネットワーク トラフィックが節約されます。そして今、例外をスローします。コード例は次のとおりです。

import com.google.web.bindery.autobean.shared.AutoBean.PropertyName;

public interface IPersonInfo {

    // Name
    @PropertyName("n")
    public String getName();
    public void setName(String name);

    // Surname
    @PropertyName("s")
    public String getSurname();
    public void setSurname(String surname);

    // other properties...
}

次に、これを次の方法で JSON にデコードしようとします。

AutoBean<IPersonInfo> user = factory.user();

// clone the userDto (it's a new way to clone an object in ver 2.4.0
// instad of deprecated clone() method)
Splittable data = AutoBeanCodex.encode(user);
IPersonInfo userDto = AutoBeanCodex.decode(factory, IPersonInfo.class, data).as();

userDto.setName("Name");
userDto.setSurname("Surname");
//... other properties

このコードは、レガシー コードで完全に機能しました。しかし今(GWT 2.4.0で)例外が発生します:

java.lang.IllegalArgumentException: name
    at com.google.web.bindery.autobean.shared.impl.AutoBeanCodexImpl.doCoderFor(AutoBeanCodexImpl.java:524)
    at com.google.web.bindery.autobean.shared.impl.AbstractAutoBean.setProperty(AbstractAutoBean.java:276)
    at com.google.web.bindery.autobean.vm.impl.ProxyAutoBean.setProperty(ProxyAutoBean.java:253)
    at com.google.web.bindery.autobean.vm.impl.BeanMethod$3.invoke(BeanMethod.java:103)
    at com.google.web.bindery.autobean.vm.impl.SimpleBeanHandler.invoke(SimpleBeanHandler.java:43)
    at $Proxy74.setName(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.google.appengine.tools.development.agent.runtime.Runtime.invoke(Runtime.java:104)
    at com.google.web.bindery.autobean.vm.impl.ShimHandler.invoke(ShimHandler.java:81)
    at $Proxy74.setName(Unknown Source)

インターフェイスから @PropertyName を削除すると、例外は発生しません。

公式ドキュメントが更新されるのを待っていますが、古いコード例のままです。

誰かがこの問題を解決するのを手伝ってくれますか? アドバイスありがとうございます。

私はGWT版を使用しています。2.4.0、GAE版。1.6.1.

4

1 に答える 1

6

setメソッドにも@PropertyName( "XXXX")を配置する必要がありました。試してみる。

于 2012-01-24T20:18:43.503 に答える