【问题标题】:RoboSpice with Gson and RealmRoboSpice 与 Gson 和 Realm
【发布时间】:2015-09-07 08:38:24
【问题描述】:

我将RoboSpice 与 GsonSpringAndroidSpiceService 一起使用。我也想加Realm来保存数据。

问题在于,在领域中每个对象都必须扩展领域对象,但 roboSpice 中的 gson 试图解析领域对象而不是忽略它。

我尝试添加排除策略:

Gson gson = new GsonBuilder()
        .setExclusionStrategies(new ExclusionStrategy() {

            @Override
            public boolean shouldSkipField(FieldAttributes f) {
                return f.getDeclaringClass().equals(RealmObject.class);
            }

            @Override
            public boolean shouldSkipClass(Class<?> clazz) {
                return false;
            }
        })
        .create();

然后

    GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter(gson);

还尝试(单独)将@expose 添加到对象中的字段,并且

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();

在两种情况下我有同样的错误:

09-07 11:21:04.615 8443-8443/com.mm.rsApp D/OpenGLRenderer: 启用调试模式 0 09-07 11:21:04.620 8443-8443/com.mm.rsApp D//SpiceManager.java:1018: 11:21:04.625 main 绑定到服务:GsonSpiceService 09-07 11:21:04.625 8443-8466/com.mm.rsApp D//SpiceManager.java:1133: 11:21:04.628 Thread-16362 Bound ok。 09-07 11:21:04.690 8443-8443/com.mm.rsApp I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@41b8f088 time:525639153 09-07 11:21:21.890 8443-8466/com.mm.rsApp D//SpiceManager.java:245: 11:21:21.896 Thread-16362 向服务发送请求:CachedSpiceRequest 09-07 11:21:21.895 8443-8466/com.mm.rsApp D//RequestProcessor.java:70: 11:21:21.898 Thread-16362 将请求添加到队列 1103121632: CachedSpiceRequest [requestCacheKey=login, cacheDuration=-1 , spiceRequest=com.mm.rsApp.requests.BaseRequest@41d700c0] 大小为 0 09-07 11:21:21.900 8443-8466/com.mm.rsApp D//RequestProcessor.java:89: 11:21:21.902 Thread-16362 添加类型类 com.mm.rsApp.model.LoginResult 和 cacheKey 的条目登录。 09-07 11:21:21.900 8443-8466/com.mm.rsApp D//RequestProgressManager.java:54: 11:21:21.904 Thread-16362 向现有请求添加请求侦听器时发现请求。 09-07 11:21:21.900 8443-8466/com.mm.rsApp D//RequestProgressManager.java:64: 11:21:21.905 Thread-16362 发送进度 PENDING 09-07 11:21:21.905 8443-8609/com.mm.rsApp D//RequestRunner.java:68: 11:21:21.908 Thread-16369 处理请求:CachedSpiceRequest [requestCacheKey=login, cacheDuration=-1, spiceRequest= com.mm.rsApp.requests.BaseRequest@41d700c0] 09-07 11:21:21.905 8443-8609/com.mm.rsApp D//RequestRunner.java:114: 11:21:21.910 Thread-16369 缓存内容不可用或过期或禁用 09-07 11:21:21.910 8443-8609/com.mm.rsApp D//RequestRunner.java:128: 11:21:21.913 Thread-16369 调用网络请求。 09-07 11:21:21.910 8443-8609/com.mm.rsApp D//RequestProgressManager.java:64: 11:21:21.914 Thread-16369 发送进度 LOADING_FROM_NETWORK 09-07 11:21:21.915 8443-8443/com.mm.rsApp V//DefaultRequestProgressReporter.java:110: 11:21:21.917 main Notifying 1 listeners of progress com.octo.android.robospice.request.listener.RequestProgress @41d71138 09-07 11:21:21.915 8443-8443/com.mm.rsApp V//DefaultRequestProgressReporter.java:110: 11:21:21.921 main Notifying 1 listeners of progress com.octo.android.robospice.request.listener.RequestProgress @41d83c50 09-07 11:21:27.255 8443-8609/com.mm.rsApp D//RequestRunner.java:131: 11:21:27.257 Thread-16369 网络请求调用结束。 09-07 11:21:27.255 8443-8609/com.mm.rsApp D//RequestRunner.java:151: 11:21:27.259 Thread-16369 开始缓存内容... 09-07 11:21:27.260 8443-8609/com.mm.rsApp D//RequestProgressManager.java:64: 11:21:27.262 Thread-16369 发送进度 WRITING_TO_CACHE 09-07 11:21:27.260 8443-8443/com.mm.rsApp V//DefaultRequestProgressReporter.java:110: 11:21:27.265 main Notifying 1 listeners of progress com.octo.android.robospice.request.listener.RequestProgress @41e12c08 09-07 11:21:27.440 8443-8609/com.mm.rsApp I/dalvikvm: threadid=18: 调用 Lcom/google/gson/internal/$Gson$Types;.resolve:LLLL 时堆栈溢出 09-07 11:21:27.440 8443-8609/com.mm.rsApp I/dalvikvm﹕方法需要 96+20+12=128 字节,fp 为 0x5deea348(左 72) 09-07 11:21:27.440 8443-8609/com.mm.rsApp I/dalvikvm﹕扩展堆栈端 (0x5deea300 到 0x5deea000) 09-07 11:21:27.440 8443-8609/com.mm.rsApp I/dalvikvm﹕收缩堆栈(至 0x5deea300,curFrame 为 0x5deeac94) 09-07 11:21:27.480 8443-8609/com.mm.rsApp D//RequestRunner.java:199: 11:21:27.482 Thread-16369 处理请求 CachedSpiceRequest [requestCacheKey=login, cacheDuration=- 1、spiceRequest=com.mm.rsApp.requests.BaseRequest@41d700c0] java.lang.StackOverflowError 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) 在 com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:356) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:141) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) 在 com.google.gson.Gson.getAdapter(Gson.java:359) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access 100 美元(ReflectiveTypeAdapterFactory.java:46) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:92) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) 在 com.google.gson.Gson.getAdapter(Gson.java:359) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access 100 美元(ReflectiveTypeAdapterFactory.java:46) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:92) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) 在 com.google.gson.Gson.getAdapter(Gson.java:359) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access 100 美元(ReflectiveTypeAdapterFactory.java:46) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:92) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142) 在 com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) 在 com.google.gson.Gson.getAda

请帮助我了解为什么会出现此错误以及如何解决它

【问题讨论】:

标签: android gson robospice


【解决方案1】:

我将RobospiceRetrofitRealm 一起使用。

我通过在扩展RetrofitGsonSpiceServiceService 类中覆盖createConverter() 来解决它。不幸的是,我不能说得更清楚,因为我没有使用过GsonSpringAndroidSpiceService

所以在我的Service 类中它看起来像这样:

@Override
protected Converter createConverter() {
    Gson gson = new GsonBuilder()
            .setExclusionStrategies(new ExclusionStrategy() {
                @Override
                public boolean shouldSkipField(FieldAttributes f) {
                    return f.getDeclaringClass().equals(RealmObject.class);
                }

                @Override
                public boolean shouldSkipClass(Class<?> clazz) {
                    return false;
                }
            })
            .create();

    return new GsonConverter(gson);
}

所以想法是找到Gson 可以使用默认配置初始化的位置。这就是为什么我也将上述配置传递给Retrofit

new RestAdapter.Builder()
               .setConverter(new GsonConverter(gson))
               .build();

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-04
    • 2016-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多