2017-08-22 3 views
1

Ich habe eine Klasse Person in gwt und ich habe geschickt umgewandelt, um eine Instanz von Person mit Servlet Gson vom Server zum Client. Aber auf der Clientseite scheint ich Gson nicht verwenden zu können. Von dem, was ich in Foren gelesen habe, scheint es, dass der beste Weg AutoBeansJson zu Objekt Person wieder zu konvertieren ist.Wie zum Umwandeln von json zu Java-Klasse verwenden autobean in GWT

Allerdings kann ich in AutoBeans nur eine Schnittstelle verwenden. Ich werde schätzen, wenn mir jemand helfen kann, es zu schreiben.

Ein json Beispiel, das ich vom Server bekommen und will wieder Person Klasse konvertieren:

{ "name": "aaa", "Familie": "fff", "username": "uuu" "Alter": 20 "Handys": [{ "id": 0, "phonenumber": "0911111"}], "Verwandte": [null]}

public class Person implements Serializable { 
    private String name; 
    private String family; 
    private String username; 
    private int age; 
    private List<Phone> phones; 
    private List<Person> relatives; 

    public Person() { 
    } 

    public Person(String name, String family, String username, int age, List<Phone> phones, List<Person> relatives) { 
     this.name = name; 
     this.family = family; 
     this.username = username; 
     this.age = age; 
     this.phones = phones; 
     this.relatives = new ArrayList<Person>(); 
     this.relatives = relatives; 
    } 

    public void addPhone(Phone p) { 
     phones.add(p); 
    } 

    public String getName() { 
     return this.name; 
    } 

    public String getFamily() { 
     return this.family; 
    } 

    public int getAge() { 
     return this.age; 
    } 

    public String getUsername() { 
     return this.username; 
    } 

    public List<Phone> getNumbers() { 
     return this.phones; 
    } 

    public List<Person> getRelatives() { 
     return this.relatives; 
    } 

    public String getAllNumbers() { 
     return Phone.convertPhonesToText(phones); 
    } 

    public static Person findPerson(List<Person> personList, String username) { 
     // ..... 
    } 

    public static List<Person> convertTextToPersons(List<Person> personList, String personsText) { 
     // ..... 
    } 

    public String convertPersonsToText() { 
     // .... 
    } 
} 
+0

Mögliches Duplikat von [GWT AutoBean mit POJO-Klasse anstelle der Schnittstelle] (https://stackoverflow.com/questions/6261682/gwt-autobean-with-pojo-class-instead-of-interface) – Tobika

Antwort

0

Yep, so kommentiert Die andere Antwort von Tobika zeigt an, dass AutoBeans ein Interface benötigt. AutoBeans feet besser, wenn Sie es auf beiden Seiten verwenden, Client- und Server-Seite und Sie definieren alle Ihre Modelle als Schnittstellen.

Wenn Sie Ihre Klassenmodelle verwenden möchten, können Sie GWT Jackson verwenden, das AutoBeans ziemlich ähnlich ist, aber es verwendet Ihre Modelle und bindet den JSON an Ihr Modell (wie andere serverseitige Bibliotheken; Jackson, Gson usw.): https://github.com/nmorel/gwt-jackson

public static interface PersonMapper extends ObjectMapper<Person> {} 

@Override public void onModuleLoad() { 
    PersonMapper mapper = GWT.create(PersonMapper.class); 

    String json = mapper.write(new Person("John", "Doe")); 
    GWT.log(json); // > {"firstName":"John","lastName":"Doe"} 

    Person person = mapper.read(json); 
    GWT.log(person.getFirstName() + " " + person.getLastName()); 
} 

Alternativ können Sie auch einfach nur GWT mit JsInterop verwenden. Dies hat viele Einschränkungen, aber selbst mit dieser Einschränkung ist es eine ziemlich gute Option. Dies ist meine bevorzugte Option, wenn Sie die Vererbung in Ihren DTOs vermeiden können. Aber das hat den großen Vorteil, dass es superleicht ist (eigentlich null Overhead-Mapping-Overhead und null Code-Overhead, da es natives Parsing und keine Kopien verwendet und direkt auf das geparste JSON-Objekt zugreift). Einschränkungen: kann keine Vererbung verwenden, "defekte Systemtyp" (alle X instanceof SomeDtoType gibt immer wahr, da alle DTOs sind vom Typ Object sinnvoll, weil wir tatsächlich die geparste JSON verwenden), kann nicht nur Sammlungen native Arrays verwenden (aber dank java8 Streamen Sie dies sollte kein Problem sein, was auch immer Sie mit Stream.of (arr) tun wollen, und nur Double und Boolean Boxed Typen unterstützt (nicht unterstützt irgendeine Phantasie Typ wie Date oder BigInteger, nicht lange/Lange .. .).

Diese einfachen und begrenzten DTOs sind eher ein DTO-Schema als ein Typ. Aber es hat einen großen Vorteil, dass diese DTOs mit den meisten serverseitigen Parsern out of the box funktioniert. Jackson und GSON werden ohne Konfiguration codieren und analysieren.