GWT AutoBean с классом POJO вместо интерфейса - PullRequest
16 голосов
/ 07 июня 2011

Я надеюсь, что кто-то может предложить простое решение моей проблемы.

У меня есть POJO, скажем:

public class Person
{
    private String name;
    public String getName(){ return name; }
    public void setName(String name){ this.name = name; }
}

Я бы хотел использовать функциональность GWT AutoBean для сериализации/ Десериализовать этот компонент в JSON, но AutoBean ожидает интерфейс:

public interface Person
{
    public String getName();
    public void setName(String name);
}

У меня есть настройка AutoBeanFactory:

public interface PersonFactory extends AutoBeanFactory
{
    AutoBean<Person> person();
}

Используя фабрику и интерфейс Person, я могу десериализоватьa JSON Person:

PersonFactory personFactory = GWT.create(PersonFactory.class);
AutoBean<Person> autoBeanPerson = AutoBeanCodex.decode(personFactory, Person.class, jsonObject.toString());
Person person = autoBeanPerson.as();

Однако, если я заменю интерфейс Person на класс Person, я получу исключение AutoBeanFactoryGenerator, в котором говорится: "com.xxx.xxx.Person не является интерфейсом".

Как я могу использовать сериализацию / десериализацию AutoBean с моим простым POJO?

Ответы [ 2 ]

10 голосов
/ 07 июня 2011

Вы просто не можете. AutoBean генерирует легкие, оптимизированные реализации интерфейсов; очевидно, он не может сделать это для классов. Это по замыслу .

8 голосов
/ 28 марта 2012

Это возможно, если это простой POJO и не имеет свойств других типов автобинов:

1) Make PersonPojo implements Person

2) Добавить метод обертки к фабрике:

public interface PersonFactory extends AutoBeanFactory {
    AutoBean<Person> person( Person p ); // wrap existing
}

3) Создать упакованный AutoBean и сериализовать с AutoBeanCodex.encode в JSON

PersonPojo myPersonPojo = new PersonPojo("joe");
AutoBean<Person> autoBeanPerson = personFactory.person( myPersonPojo );
...