Подтвердить что ты не робот

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.

4b9b3361

Ответ 1

Из Руководство пользователя GSON:

При десериализации Object, Gson должен создать экземпляр по умолчанию класса [...] Хорошо организованные классы, предназначенные для сериализации и десериализации, должны иметь конструктор без аргументов

Ваша проблема в том, что GSON Instance Creator нуждается в конструкторе без аргументов в классе, в котором вы хотите десериализовать ответ JSON, а именно MessageBase.

В противном случае вам нужно написать собственный экземпляр-создатель, например this.

Ответ 2

У меня та же проблема, когда использовать модификацию и выяснить, это происходит при использовании абстрактного класса, поэтому я создаю пустой класс, который расширяет абстрактный класс (MessageBase), например так:

public class BaseResponse extends MessageBase {

}

А теперь используйте BaseResponse, у которого есть все поля MessageBase

Ответ 3

Абстрактные классы не могут быть созданы, только подклассы. Тела абстрактного метода должны быть пустыми (без фигурных скобок). Удалите "абстрактный" из общедоступной базы сообщений, и все готово.

Смотрите ссылку Java абстрактные классы