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.


person user1612863    schedule 10.03.2013    source источник


Ответы (4)


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

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

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

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

person MikO    schedule 20.04.2013
comment
Кроме того, создаваемый GSON класс не может быть абстрактным, поэтому приведенный выше код не сработает даже с правильным конструктором. - person stealthcopter; 08.10.2016

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

public class BaseResponse extends MessageBase {

}

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

person Radesh    schedule 21.11.2018

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

См. Ссылку Абстрактные классы Java

person Jay Patel    schedule 08.07.2019

Убедись!

1- Класс implements Serializable

2- Не быть абстрактным даже дочерним классам

3- Должен быть публичным

person Ali Akram    schedule 27.01.2021