【问题标题】:java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to ClassNamejava.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 ClassName
【发布时间】:2020-05-03 08:36:54
【问题描述】:

我曾经使用retrofit和rxjava处理带有o的Api的两个响应的Api。我正在创建响应模型和错误模型。 我不知道如何在一个 Api 中处理这两种响应,这是我的实现

@POST("login/")
Observable<Response<Object>> login(@Body LoginParamModel model);

这是我的 api 实现

 RetroClient.getClient(ApiEndPointInterface.URl).create(ApiEndPointInterface.class)
            .login(model).subscribeOn(Schedulers.computation())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<Response<Object>>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(Response<Object> loginDataModelResponse) {
                    mLoginDataModelResponse=loginDataModelResponse;
                }

                @Override
                public void onError(Throwable e) {
                    mLoginView.LoginError(e.getMessage());
                }

                @Override
                public void onComplete() {
                    if (mLoginDataModelResponse.code() == 200 || mLoginDataModelResponse.code() == 201) {


                        LoginDataModel loginDataModel = (LoginDataModel) mLoginDataModelResponse.body();
                        mLoginView.LoginResult(loginDataModel);
                    } else if (mLoginDataModelResponse.code() == 400) {
                        try {
                            mLoginView.LoginError(CommonUtill.JsonReader(mLoginDataModelResponse.errorBody().string()));
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });

我取得了成功,但问题是我没有将对象类转换为模型类

 LoginDataModel loginDataModel = (LoginDataModel) mLoginDataModelResponse.body();

我遇到了这种类型的异常:

W:io.reactivex.exceptions.UndeliverableException:无法将异常传递给消费者,因为它已经取消/处置了流程,或者异常无处可去。进一步阅读:https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#error-handling | java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 com.model.login.LoginDataModel

W:原因:java.lang.ClassCastException:com.google.gson.internal.LinkedTreeMap 无法转换为 com.model.login.LoginDataModel

LoginDataModel 是我的 Api 响应模型类,这里是 RetroClientClass

public class RetroClient {
private static Retrofit retrofit = null;
private Context mContext;

public static Retrofit getClient(String BaseUrl) {
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.level(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient client = new OkHttpClient
            .Builder()
            .addInterceptor(new Interceptor() {
                @NotNull
                @Override
                public Response intercept(@NotNull Chain chain) throws IOException {

                    String token = CommonUtill.ACCESS_TOKEN;
                    Request request = chain.request();

                    request = request.newBuilder()
                            .addHeader("Content-Type", "application/x-www-form-urlencoded")
                            .addHeader("Authorization", "Bearer " + token)
                            .addHeader("X-TOKEN-AUTHENTICATION", "True")
                            .build();
                    return chain.proceed(request);
                }
            })
            .readTimeout(10, TimeUnit.SECONDS)
            .connectTimeout(30, TimeUnit.SECONDS)
            .addInterceptor(interceptor)
            .build();


    if (retrofit == null) {
        retrofit = new Retrofit.Builder()
                .baseUrl(BaseUrl)
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .client(client)
                .build();
    }
    return retrofit;
}

}

【问题讨论】:

标签: object observable retrofit rx-java rx-android


【解决方案1】:

请更改 ApiInterface

@POST("login/")
Observable<Response<LoginDataModel>> login(@Body LoginParamModel model);

【讨论】:

    猜你喜欢
    • 2018-06-10
    • 2020-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多