java.lang.RuntimeException:无法调用没有args的公共com.example.syncapp.MessageBase()

时间:2013-03-10 22:15:07

标签: java android json gson runtimeexception

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;  
}

代码一直有效,直到MessageBase msggg=gson.fromJson(data, MessageBase.class);。我得到了这个例外:

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)

我需要做什么? 我把.jar放在lib文件夹中,我认为tomcat加载了.jar。

4 个答案:

答案 0 :(得分:22)

来自GSON User Guide

  

在反序列化Object时,Gson需要创建类的[strong>默认实例 [...]用于序列化和反序列化的性能良好的类应该具有无参数构造函数

您的问题是GSON的 Instance Creator 需要在您要反序列化JSON响应的类中使用无参数构造函数,即MessageBase

否则,您需要编写自己的Instance Creator,例如this

答案 1 :(得分:2)

我在使用改造时遇到相同的问题,并发现在使用抽象类时会发生这种情况,因此我创建了一个扩展抽象类的空类({{1} }):

MessageBase

现在使用public class BaseResponse extends MessageBase { } 并具有BaseResponse的所有字段

答案 2 :(得分:0)

只能实例化抽象类,不能实例化。抽象方法主体必须为空(无花括号)。 从公共MessageBase中删除“摘要”,您就可以开始了。

查看链接Java Abstract Classes

答案 3 :(得分:0)

确保!

1- 类 implements Serializable

2- 即使是子类也不要抽象

3- 应该是公开的