Как установить свойство в классе 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>());
Другие вопросы по тегам