RoboSpice与Gson和Realm

dvr*_*vrm 6 android gson robospice

我正在使用RoboSpice和GsonSpringAndroidSpiceService.我还想添加Realm来保存数据.

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

我试图添加排除状态:

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();
Run Code Online (Sandbox Code Playgroud)

然后

    GsonHttpMessageConverter gsonHttpMessageConverter = new GsonHttpMessageConverter(gson);
Run Code Online (Sandbox Code Playgroud)

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

Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
Run Code Online (Sandbox Code Playgroud)

在两种方式我有同样的错误:

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绑定好.09-07 11:21:04.690 8443-8443/com.mm.rsApp I /时间轴:时间轴:Activity_idle id:android.os.BinderProxy@41b8f088时间: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] size is 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线程16369处理请求:CachedSpiceRequest [requestCacheKey =登录,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调用netwok请求.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通知1个进步的听众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通知1个进步的听众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主要通知1名进步听众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. java.lang.StackOverflowError atcom.google.gson.internal.$ Gson $ Types.resolve($ Gson $ Types.java:381)在com.google.gson.internal.$ Gson $ Types.resolve($ Gson $ Types.java:376)at at com.google.gson.internal.$ Gson $ Types.resolve($ Gson $ Types.java:381)在com.google.gson.internal.$ Gson $ Types.resolve($ Gson $ Types.java:376)at at com.google.gson.internal.$ Gson $ Types.resolve($ Gson $ Types.java:381)在com.google.gson.internal.$ Gson $ Types.resolve($ Gson $ Types.java:376)at at com.google.gson.internal.$ Gson $ Types.resolve($ Gson $ Types.java:381)在com.google.gson.internal.$ Gson $ Types.resolve($ Gson $ Types.java:376)at at com.google.gson.internal.$ Gson $ Types.resolve($ Gson $ Types.java:381)在com.google.gson.internal.$ Gson $ Types.resolve($ Gson $ Types.java:376)at at com.google.gson.com.google.gson上的com.google.gson.internal.$ Gson $ Types.resolve($ Gson $ Types.java:376)中的$ Gson $ Types.resolve($ Gson $ Types.java:381). com.google.gson上的com.google.gson.internal.$ Gson $ Types.resolve($ Gson $ Types.java:376)中的$ Gson $ Types.resolve($ Gson $ Types.java:381). com.google.gson上的com.google.gson.internal.$ Gson $ Types.resolve($ Gson $ Types.java:376)中的$ Gson $ Types.resolve($ Gson $ Types.java:381). com.google.gson上的com.google.gson.internal.$ Gson $ Types.resolve($ Gson $ Types.java:376)中的$ Gson $ Types.resolve($ Gson $ Types.java:381). com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields中的$ Gson $ Types.resolve($ Gson $ Types.java:356)(ReflectiveTypeAdapterFactory.java:141)com.google.gson.internal.bind.RewlectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83)at 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.com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java)中的com.google.gson.Gson.getAdapter(Gson.java:359)中的internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83): 122)com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.access $ 100(ReflectiveTypeAdapterFactory.java:46)com.google上的com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ 1.(ReflectiveTypeAdapterFactory.java:92). gson.internal.bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91)位于com.google.gson.internal.bind的com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142).位于com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getFieldAdapter(ReflectiveTypeAdapterFactory.java:122)的com.google.gson.Gson.getAdapter(Gson.java:359)上的ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:83)位于com.google.gson.internal的com.google.gson.internal.bind.ReflectiveTypeAdapterFactory $ 1.(ReflectiveTypeAdapterFactory.java:92).google.gson.internal.bind.ReflectiveTypeAdapterFactory.access $ 100(ReflectiveTypeAdapterFactory.java:46). bind.ReflectiveTypeAdapterFactory.createBoundField(ReflectiveTypeAdapterFactory.java:91)位于com.google.gson.internal.bind.ReflectiveTypeAdapterFactory的com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:142).在com.google.gson.Gson.getAda上创建(ReflectiveTypeAdapterFactory.java:83)

请帮助我知道为什么我会收到此错误,我该如何解决它

Sav*_*kii 5

我用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);
}
Run Code Online (Sandbox Code Playgroud)

因此,我们的想法是找到Gson可以使用默认配置初始化的位置.这也是我通过上述配置的原因Retrofit.

new RestAdapter.Builder()
               .setConverter(new GsonConverter(gson))
               .build();
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.