【问题标题】:How to set a property in Abstract class when using RestTemplate with Spring for Android将 RestTemplate 与 Spring for Android 一起使用时如何在抽象类中设置属性
【发布时间】:2013-04-11 06:53:20
【问题描述】:

我正在使用 Spring for Android 从我的 restful 服务器和 gson 请求数据到 Converter json to Java object,而不访问对象中的任何函数。
由于有一个json属性“user_id”,所以我想在转换后将它保存为sqlite数据的主键。
问题是我的sqlite库将“mId”属性定义为抽象类中的主键。而gson convert没有使用“set function”来设置属性。 我唯一想要的就是将 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.restful用户数据类:

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);

【问题讨论】:

    标签: java spring gson abstraction


    【解决方案1】:

    为您的类声明一个自定义反序列化器。类似于下面的那个。

    报价 - 模型

    class Quote
    {
        private String symbol;
        private String test; // the empty field we want to populate
    
        // getters() setters()
    }
    

    QuoteCreator 反序列化器 - 从符号填充测试

    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>());
    

    【讨论】:

    • 谢谢 Deepak,我已经尝试过这样做。 this.setId(userId);设置 mId。但是 gson 转换器没有访问 setUserId 函数!所以没能解决这个问题。
    • 我假设你的意思是你会尝试这样做。让我们知道结果如何。谢谢。
    • 哦,对了,gson 在编组期间不使用getters() setters()。让我探索另一种解决方案。
    • @AllenDing 删除了我的旧答案并用新答案更新了它。看看吧。
    • Thx @deepak-bala !真的对我有用。但由于我有很多实体从模型扩展,我应该为它添加一个反序列化器并为每个转换添加适配器。也许有更好的方法完成它。
    猜你喜欢
    • 2021-08-21
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多