2013-03-10 9 views
11
protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException { 

    System.out.println(request.getParameter("msg").toString()); 
    String data = request.getParameter("msg").toString(); 
    Gson gson = new Gson(); 
    MessageBase msggg = gson.fromJson(data, MessageBase.class); 
    //System.out.println(msggg.Id + msggg.MessageText); 
} 

public abstract class MessageBase implements Serializable { 
    public int Id; 
    public String MessageText; 
    public Date ReceiveDate; 
} 

public class SyncSmsMessage extends MessageBase { 
    public String SenderNum; 
} 

Kod działa aż MessageBase msggg=gson.fromJson(data, MessageBase.class);. Otrzymuję ten wyjątek:java.lang.RuntimeException: Nie można powoływać com.example.syncapp.MessageBase publicznego() bez args

java.lang.RuntimeException: Failed to invoke public com.example.syncapp.MessageBase() with no args 
    at com.google.gson.internal.ConstructorConstructor$2.construct(ConstructorConstructor.java:94) 
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:162) 
    at com.google.gson.Gson.fromJson(Gson.java:795) 
    at com.google.gson.Gson.fromJson(Gson.java:761) 
    at com.google.gson.Gson.fromJson(Gson.java:710) 
    at com.google.gson.Gson.fromJson(Gson.java:682) 
    at AndroidServlet.doPost(AndroidServlet.java:75) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 

Co muszę zrobić? Umieściłem .jar w folderze lib i uważam, że tomcat ładuje dobrze .jar.

Odpowiedz

17

Od GSON User Guide:

Podczas deserializacji się Object, Gson musi stworzyć domyślnej instancji klasy [...] Grzeczne klas, które są przeznaczone do serializacji i deserializacji powinny mieć konstruktor bez argumentów

Twój problem polega na tym GSON za Instance Creator potrzebuje konstruktor no-argument klasa, w której chcesz deserializować odpowiedź JSON, a mianowicie .

W przeciwnym razie musisz napisać własną aplikację Instance Creator, na przykład this.

+5

Również klasa, którą tworzy GSON, nie może być abstrakcyjna, więc powyższy kod nie powiedzie się nawet przy prawidłowym konstruktorze. – stealthcopter

Powiązane problemy