java.lang.RuntimeException:未能调用没有参数的 public com.example.syncapp.MessageBase()

2022-09-01 22:50:07
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好。


答案 1

来自 GSON 用户指南

在反序列化对象时,Gson 需要创建类的默认实例 [...]用于序列化和反序列化的行为良好的类应具有无参数构造函数

您的问题是GSON的实例创建器在要反序列化JSON响应的类中需要一个无参数构造函数,即.MessageBase

否则,您需要编写自己的实例创建器,如下所示。


答案 2

我在使用改造时遇到同样的问题,并弄清楚这是在使用抽象类时发生的,所以我创建了扩展抽象类()空类,如下所示:MessageBase

public class BaseResponse extends MessageBase {

}

现在使用,有所有领域BaseResponseMessageBase