Как установить свойство в классе Abstract при использовании RestTemplate с Spring для Android
Я использую Spring для Android для запроса данных с моего спокойного сервера и gson в Converter json to Java objetct без доступа к какой-либо функции в объекте.
Так как есть свойство json "user_id", я хочу сохранить его как первичный ключ данных sqlite после преобразования.
Проблема в том, что моя библиотека sqlite определила свойство "mId" в качестве первичного ключа в абстрактном классе. И gson convert не использует "функцию set" для установки свойства. Единственное, что я хочу, это включить user_id в mId правильно.
Вот код:
1. абстрактный класс для доступа к sqlite:
public abstract class Model {
protected Long mId = null;
public final Long getId() {
return mId;
}
public void setId(Long id){
mId = id;
}
public void saveToSqlite(){
//using mId;
}
}
2. Класс для спокойных пользовательских данных:
public class User extends Model implements Serializable{
private static final long serialVersionUID = 1L;
@SerializedName("user_id")
private Long userId;
public Long getUserId() {
return userId;
}
//this function is not accessed when user object generated
public void setUserId(Long userId) {
this.userId = userId;
this.setId(userId);
}
}
3. запросить и конвертировать код:
RestTemplate restTemplate = new RestTemplate();
GsonHttpMessageConverter jsonConverter = new GsonHttpMessageConverter();
restTemplate.getMessageConverters().add(jsonConverter);
final String url = "http://restful.test.com/users";
User[] users = restTemplate.getForObject(url, User[].class);
1 ответ
Объявите пользовательский десериализатор для вашего класса. Что-то вроде того, что ниже.
Цитата - Модель
class Quote
{
private String symbol;
private String test; // the empty field we want to populate
// getters() setters()
}
QuoteCreator deserializer - заполнить тест из символа
class QuoteCreator implements JsonDeserializer<Quote>
{
public Quote deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException
{
Gson g = new Gson();
Quote a = g.fromJson(json, Quote.class);
a.setTest(a.getSymbol());
return a;
}
}
Бежать
GsonBuilder b = new GsonBuilder();
b.registerTypeAdapter(Quote.class,new QuoteCreator());
Gson create = b.create();
Quote fromJson = (Quote) create.fromJson(file, Quote.class);
Оно работает. Вы можете использовать более общее рефлексивное решение, чтобы поймать различные классы, но это проще, если JSON просто исправляется, вместо того чтобы прибегать к обходным путям, подобным этому.
Универсальный десериализатор
class MyCreator<T> implements JsonDeserializer<T>
{
public T deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
throws JsonParseException
{
try
{
Gson g = new Gson();
T a = g.fromJson(json, typeOfT);
Class<? extends Object> class1 = a.getClass();
Method getter = class1.getMethod("getSymbol", null);
Method setter = class1.getMethod("setTest", String.class);
String symbol = (String) getter.invoke(a, null);
setter.invoke(a, symbol);
return a;
}
catch (Exception e)
{
e.printStackTrace();
return null;
}
}
}
использование
b.registerTypeAdapter(Quote.class,new MyCreator<Quote>());