【问题标题】:java.lang.RuntimeException: Failed to invoke public com.example.syncapp.MessageBase() with no argsjava.lang.RuntimeException:无法调用没有参数的公共 com.example.syncapp.MessageBase()
【发布时间】:2013-02-26 00:34:20
【问题描述】:
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。

【问题讨论】:

    标签: java android json gson runtimeexception


    【解决方案1】:

    来自GSON User Guide

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

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

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

    【讨论】:

    • 另外,GSON 创建的类不能是抽象的,所以即使使用正确的构造函数,上面的代码也会失败。
    【解决方案2】:

    我在使用改造时遇到了同样的问题,并发现这是在使用 abstract 类时发生的,所以我创建了 extends 抽象类的空类 (MessageBase)像这样:

    public class BaseResponse extends MessageBase {
    
    }
    

    现在使用具有MessageBase 的所有字段的BaseResponse

    【讨论】:

      【解决方案3】:

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

      查看链接Java Abstract Classes

      【讨论】:

        【解决方案4】:

        确定!

        1- 类implements Serializable

        2- 即使是子类也不抽象

        3- 应该是公开的

        【讨论】:

          【解决方案5】:

          问题示例:

          你有一个由抽象类成员组成的抽象类,然后你扩展这个主类及其成员。

          public abstract class Receipt implements Serializable {
          
              @Expose
              protected ReceiptMainDetails mainDetails;
          
              @Expose
              protected ReceiptDetails payerReceiptDetails;
          
              @Expose
              protected ReceiptDetails payeeReceiptDetails;
          

          (细节也很抽象)

          public class TransferReceipt extends Receipt {
          
              public TransferReceipt() {}
          
              public TransferReceipt(TransferDetails body, Payer payer, Payee payee) {
                  super(body, payer, payee);
              }
          
              public  static class TransferDetails extends ReceiptMainDetails {
          
                  public TransferDetails() {}
          
              }
          

          (其他细节也有所扩展)

          GSON 将无法将 json 转换为对象。

          解决方案

          Receipt 可以是抽象的,但它的成员必须是具体的类,即使您可以再次扩展它们。

          测试您的解决方案

          @Test
          public void testGson() {
          
              String jsonString = "{youChooseWhatIsHere}";
          
              Gson gson = new Gson();
          
              TransferReceipt receipt = gson.fromJson(jsonString, TransferReceipt.class);
          
              String actualReceiptJson = gson.toJson(receipt);
          
              System.out.println(jsonString);
              System.out.println(actualReceiptJson);
              System.out.println(receipt);
          }
          

          【讨论】:

            猜你喜欢
            • 2018-08-23
            • 1970-01-01
            • 2020-11-07
            • 1970-01-01
            • 2017-06-05
            • 1970-01-01
            • 2014-04-22
            • 1970-01-01
            • 2019-07-28
            相关资源
            最近更新 更多