GWT AutoBean: аннотация @PropertyName больше не работает - PullRequest
1 голос
/ 24 января 2012

Я использую AutoBean для кодирования / декодирования данных в JSON, и это было хорошо в предыдущих версиях GWT.На мой взгляд, AutoBean - очень хороший и удобный инструмент для работы с JSON.Начиная с GWT ver.2.4.0 эта функциональность изменилась, и я потратил некоторое время, чтобы восстановить ее в своем коде.Но только одна часть остается нефиксированной - аннотация @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 ver.1.6.1.

1 Ответ

6 голосов
/ 25 января 2012

Мне нужно было также добавить @PropertyName ("XXXX") в мои методы set. Попробуйте.

...