Ошибка при попытке спарсить JSON: Failed to invoke public com.example.walker.activewithretrofit.model.Category() with no args
Я хочу использовать retrofit 2 + active android ORM, но я хочу использовать всего один класс модели для этих двух библиотек.
Если в своей модели я НЕ наследуюсь от com.activeandroid.Model, то JSON парсится с помощью Retrofit нормально, а если я наследуюсь, то выходит такая ошибка (в названии темы).
Как объединить использование двух библиотек в одном классе и при этом не получать ошибку?
Мой код: MainActivity.java
public class MainActivity extends AppCompatActivity {
public static final String DEBUG = "DEBUG";
private ArrayList<Category> categoryList;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
categoryList = new ArrayList<>();
//ПАРСИМ JSON
ApiService api = RetroClient.getApiService();
Call<List<Category>> call = api.getMyJSON();
call.enqueue(new Callback<List<Category>>() {
@Override
public void onResponse(Call<List<Category>> call, Response<List<Category>> response) {
Log.d(DEBUG, "Я в onResponse ");
if (response.isSuccessful()) {
categoryList.addAll(response.body());
Log.d(DEBUG, categoryList.get(0).getImageUrl());
} else {
Log.d(DEBUG, "Я в onResponse - ELSE ");
}
}
@Override
public void onFailure(Call<List<Category>> call, Throwable t) {
Log.d(DEBUG, "Я в onFailure " + t.getMessage());
}
});
}
}
ApiService.java и RetroClient.java
public interface ApiService {
@GET("menuserver5/categories")
Call<List<Category>> getMyJSON();
}
public class RetroClient {
private static final String ROOT_URL = "http://139.59.164.239:8080/";
private static Retrofit getRetrofitInstance() {
return new Retrofit.Builder()
.baseUrl(ROOT_URL)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
public static ApiService getApiService() {
return getRetrofitInstance().create(ApiService.class);
}
}
Category.java - думаю тут проблема
@Table(name = "Categories")
public class Category extends Model {
@SerializedName("id")
@Expose
private int id;
@Column(name = "titleRu")
@SerializedName("titleRu")
@Expose
private String titleRu;
@Column(name = "titleEng")
@SerializedName("titleEng")
@Expose
private String titleEng;
@Column(name = "url")
@SerializedName("url")
@Expose
private String url;
@Column(name = "imageUrl")
@SerializedName("imageUrl")
@Expose
private String imageUrl;
@Column(name = "weight")
@SerializedName("weight")
@Expose
private int weight;
@Column(name = "menuId")
@SerializedName("menuId")
@Expose
private int menuId;
@Column(name = "status")
@SerializedName("status")
@Expose
private int status;
public Category() {
}
//GETTERS AND SETTERS - не стал сюда заливать, чтобы не было лишнего кода
Стек трейс ошибки:
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: java.lang.RuntimeException: Failed to invoke public com.example.walker.activewithretrofit.model.Category() with no args
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:116)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:210)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:82)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:116)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:106)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at okhttp3.RealCall$AsyncCall.execute(RealCall.java:133)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at java.lang.Thread.run(Thread.java:818)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.activeandroid.TableInfo.getIdName()' on a null object reference
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at com.activeandroid.Model.<init>(Model.java:55)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at com.example.walker.activewithretrofit.model.Category.<init>(Category.java:0)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at java.lang.reflect.Constructor.newInstance(Native Method)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at java.lang.reflect.Constructor.newInstance(Constructor.java:288)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: at com.google.gson.internal.ConstructorConstructor$3.construct(ConstructorConstructor.java:108)
09-18 17:15:12.902 11692-11692/com.example.walker.activewithretrofit W/System.err: ... 14 more
Моя цель: скачивание JSON'a с сервера, загрузка данных в SQLite и отображение в RecyclerView.
Вот суть вашей ошибки:
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.activeandroid.TableInfo.getIdName()' on a null object reference
at com.activeandroid.Model.<init>(Model.java:55)
А вот причина, вторая строка конструктора, mTableInfo
равно null
в вашем случае
public Model() {
mTableInfo = Cache.getTableInfo(getClass());
idName = mTableInfo.getIdName();
}
https://github.com/pardom/ActiveAndroid/blob/master/src/com/activeandroid/Model.java
Если собрались использовать ActiveAndroid
, прочтите документацию и проинициализируйте фреймворк как положено.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
Почему программа даже при правильных ответах ставит оценку 2(1) и говорит "Правильных ответов - 0, неправильных ответов 7"Как это исправить?
Мне необходимо преобразовать строку с датой в объект LoacalDate чтобы с ним дальше работатьПостоянно появляется сообщение: Exception in thread "main" java