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

新手上路,请多包涵
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。

原文由 user1612863 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 475
1 个回答

来自 GSON 用户指南

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

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

否则,您需要像 这样 编写自己的 Instance Creator。

原文由 MikO 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题