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

Mã này hoạt động cho đến khi MessageBase msggg=gson.fromJson(data, MessageBase.class);. Tôi nhận ngoại lệ này:java.lang.RuntimeException: Không thể gọi com.example.syncapp.MessageBase công cộng() mà không 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) 

Tôi cần làm gì? Tôi đặt .jar trong thư mục lib và tôi nghĩ rằng tải tomcat tốt .jar.

Trả lời

17

Từ GSON User Guide:

Trong khi deserializing một Object, Gson cần để tạo ra một dụ mặc định của lớp [...] lớp Vâng cư xử đó có nghĩa là cho serialization và deserialization nên có một không tham số constructor

vấn đề của bạn là Instance Đấng tạo Hóa GSON của cần một constructor không có đối số trong lớp mà bạn muốn deserialize phản hồi JSON, cụ thể là .

Nếu không, bạn cần viết Trình tạo sơ thẩm của riêng mình, như this.

+5

Ngoài ra lớp GSON đang tạo không thể trừu tượng, vì vậy mã ở trên sẽ không thành công ngay cả với hàm tạo chính xác. – stealthcopter