2013-03-10 15 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; 
} 

Il codice funziona fino MessageBase msggg=gson.fromJson(data, MessageBase.class);. Ricevo questa eccezione:java.lang.RuntimeException: Impossibile richiamare com.example.syncapp.MessageBase pubblico() senza 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) 

Cosa devo fare? Ho messo .jar nella cartella lib e penso che il tomcat carichi bene il .jar.

risposta

17

Da GSON User Guide:

durante la deserializzazione un Object, GSON ha bisogno di creare un predefinita un'istanza della classe [...] classi ben educati che sono pensati per la serializzazione e deserializzazione dovrebbe avere un no-argomento del costruttore

tuo problema è che di GSON grado Creatore ha bisogno di un costruttore senza argomenti in la classe in cui si desidera deserializzare la risposta JSON, ovvero .

Altrimenti, è necessario scrivere il proprio Istance Creator, ad esempio this.

+5

Anche la classe che GSON sta creando non può essere astratta, quindi il codice sopra non riuscirebbe nemmeno con il costruttore corretto. – stealthcopter