web-dev-qa-db-ja.com

java.lang.RuntimeException:引数なしでpublic 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をうまくロードすると思います。

18
user1612863

GSONユーザーガイド から:

Objectをデシリアライズするときに、Gsonはクラスのデフォルトインスタンスを作成する必要があります[...]正常に動作するクラスシリアル化のためのものであり、逆シリアル化には引数のないコンストラクターが必要です

あなたの問題は、GSONのInstance CreatorがJSON応答を逆シリアル化するクラス、つまりMessageBaseに引数のないコンストラクターを必要とすることです。

それ以外の場合は、 this のように、独自のインスタンス作成者を作成する必要があります。

24
MikO

私はレトロフィットを使用するときに同じ問題があり、これがabstractクラスを使用するときに発生することを理解しているため、空のクラスを作成しますextends抽象クラス(MessageBase)このような :

public class BaseResponse extends MessageBase {

}

そして、BaseResponseのすべてのフィールドを持つMessageBaseを使用します

3
Radesh

抽象クラスはインスタンス化できません。サブクラス化するだけです。抽象メソッド本体は空でなければなりません(中括弧は使用できません)。パブリックMessageBaseから「要約」を削除すれば、準備完了です。

リンクを参照 Java抽象クラス

1
Jay Patel