Ответ 1
Вы просто не можете. AutoBean генерирует легкие, оптимизированные реализации интерфейсов; он явно не может это сделать для классов. Это по дизайну.
Я надеюсь, что кто-то может предложить простое решение моей проблемы.
У меня есть POJO, скажите:
public class Person
{
private String name;
public String getName(){ return name; }
public void setName(String name){ this.name = name; }
}
Я хотел бы использовать функциональность GWT AutoBean для сериализации/десериализации этого bean в JSON, но AutoBean ожидает интерфейс:
public interface Person
{
public String getName();
public void setName(String name);
}
У меня есть настройка AutoBeanFactory:
public interface PersonFactory extends AutoBeanFactory
{
AutoBean<Person> person();
}
Используя интерфейс factory и Person, я могу десериализовать 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?
Вы просто не можете. AutoBean генерирует легкие, оптимизированные реализации интерфейсов; он явно не может это сделать для классов. Это по дизайну.
Возможно, если это простое POJO и не имеет свойств других типов автобезопасности:
1) Сделайте PersonPojo implements Person
2) Добавьте метод оболочки к factory:
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 );