android - RoboSpice 与 Gson 和 Realm

标签 android gson robospice

我正在使用 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﹕ Enabling debug mode 0 09-07 11:21:04.620 8443-8443/com.mm.rsApp D//SpiceManager.java:1018﹕ 11:21:04.625 main Bound to service : 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 Sending request to service : CachedSpiceRequest 09-07 11:21:21.895 8443-8466/com.mm.rsApp D//RequestProcessor.java:70﹕ 11:21:21.898 Thread-16362 Adding request to queue 1103121632: CachedSpiceRequest [requestCacheKey=login, cacheDuration=-1, spiceRequest=com.mm.rsApp.requests.BaseRequest@41d700c0] size is 0 09-07 11:21:21.900 8443-8466/com.mm.rsApp D//RequestProcessor.java:89﹕ 11:21:21.902 Thread-16362 Adding entry for type class com.mm.rsApp.model.LoginResult and cacheKey login. 09-07 11:21:21.900 8443-8466/com.mm.rsApp D//RequestProgressManager.java:54﹕ 11:21:21.904 Thread-16362 Request was found when adding request listeners to existing requests. 09-07 11:21:21.900 8443-8466/com.mm.rsApp D//RequestProgressManager.java:64﹕ 11:21:21.905 Thread-16362 Sending progress PENDING 09-07 11:21:21.905 8443-8609/com.mm.rsApp D//RequestRunner.java:68﹕ 11:21:21.908 Thread-16369 Processing request : 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 Cache content not available or expired or disabled 09-07 11:21:21.910 8443-8609/com.mm.rsApp D//RequestRunner.java:128﹕ 11:21:21.913 Thread-16369 Calling netwok request. 09-07 11:21:21.910 8443-8609/com.mm.rsApp D//RequestProgressManager.java:64﹕ 11:21:21.914 Thread-16369 Sending progress 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 Network request call ended. 09-07 11:21:27.255 8443-8609/com.mm.rsApp D//RequestRunner.java:151﹕ 11:21:27.259 Thread-16369 Start caching content... 09-07 11:21:27.260 8443-8609/com.mm.rsApp D//RequestProgressManager.java:64﹕ 11:21:27.262 Thread-16369 Sending progress 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: stack overflow on call to Lcom/google/gson/internal/$Gson$Types;.resolve:LLLL 09-07 11:21:27.440 8443-8609/com.mm.rsApp I/dalvikvm﹕ method requires 96+20+12=128 bytes, fp is 0x5deea348 (72 left) 09-07 11:21:27.440 8443-8609/com.mm.rsApp I/dalvikvm﹕ expanding stack end (0x5deea300 to 0x5deea000) 09-07 11:21:27.440 8443-8609/com.mm.rsApp I/dalvikvm﹕ Shrank stack (to 0x5deea300, curFrame is 0x5deeac94) 09-07 11:21:27.480 8443-8609/com.mm.rsApp D//RequestRunner.java:199﹕ 11:21:27.482 Thread-16369 An unexpected error occurred when processsing request CachedSpiceRequest [requestCacheKey=login, cacheDuration=-1, spiceRequest=com.mm.rsApp.requests.BaseRequest@41d700c0] java.lang.StackOverflowError at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:381) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:376) at com.google.gson.internal.$Gson$Types.resolve($Gson$Types.java:356) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:141) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) at com.google.gson.Gson.getAdapter(Gson.java:359) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:46) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:92) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) at com.google.gson.Gson.getAdapter(Gson.java:359) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:46) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:92) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) at com.google.gson.Gson.getAdapter(Gson.java:359) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access$100(ReflectiveTypeAdapterFactory.java:46) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.(ReflectiveTypeAdapterFactory.java:92) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83) at com.google.gson.Gson.getAda



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

最佳答案

我用了RobospiceRetrofitRealm .
我通过覆盖 createConverter() 解决了它在我的Service扩展类 RetrofitGsonSpiceService .不幸的是,我不能说得更清楚,因为我没有用过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();

希望能帮助到你。

关于android - RoboSpice 与 Gson 和 Realm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32434377/

相关文章:

java - 如何创建接收 Gson().fromJson() 的对象

java - 具有 Collection 字段的对象的 GSON 自定义序列化程序

android - 如何使用 Mockito 沿 Robospice 和 Retrofit 测试 API?

android - 我如何让 Robospice 将来自 Retrofit 和 OKHttp 的 200 响应以外的任何其他内容视为错误

java - 如何使用 T 和 List<T> 泛化类

android - Android xml 底部空间过大

android - ClassNotFoundException:在路径上找不到类:DexPathList

java - 膨胀异常 : Binary XML file line #1: Error inflating class <unknown> caused by OutOfMemoryError

android - 根据高度调整ImageView宽度

java - 如何在嵌套的 Json 响应后对 Java 类建模