2017-10-26 7 views
0

現在、Retrofit2クライアントのエラー処理部分を開発中です(RetrofitのRx実装を使用しています)。Retrofitのインスタンスを渡すことなくRetrofitのGsonConverterを使用する方法

しばらく検索した後、Retrofitによって返されたResponseBodyをエラーのPOJOにデシリアライズする簡単な方法が見つかりません。

one of the json converters supported by Retrofitを使用したいと思いますが、実際のRetrofitクラスのインスタンスを渡す必要があります。これは、私のonError()コールバックでは使用できないようです。

"onError()"コールバックから "retrofit"を提供する方法はありますか?それとも、それを提供せずに非直列化を行う方法はありますか?なぜこれが必要なのか分かりません。

いいえ、私のデザインは悪いですか?

This postは、それを取り除く方法を提供しますが、それは私のためには機能しません、それは時代遅れだと思います。

This oneは、改造インスタントにアクセスするためにウォークアラウンドを使用しますが、私はそれを望んでいません。

それ以外の投稿では、独自のパーサーを使用するように提案されており、実際には必要ありません。

私はちょうど Gson.fromJson()、ない GsonConverter.responseBodyConverter()を使用するために必要な
api.login(email, password) 
    .subscribeOn(Schedulers.io()) 
    .observeOn(AndroidSchedulers.mainThread()) 
    .subscribe(new Observer<LoginResponse>() { 
     @Override 
     public void onSubscribe(@NonNull Disposable d) { 
      // Nothing to do 
     } 

     @Override 
     public void onNext(@NonNull LoginResponse loginResponse) { 
      // Normal use case with 2xx http status 
     } 

     @Override 
     public void onError(@NonNull Throwable e) { 
      // non-2xx http status handled here 
      // This is what I tried 
      if (e instanceof HttpException) { 
       HttpException exception = (HttpException) e; 
       Response response = exception.response(); 
       Converter<ResponseBody, LoginError> converter = GsonConverterFactory.create()          
        .responseBodyConverter(LoginError.class, new Annotation[0], retrofit); //<--- How can I provide "retrofit" here ? 
       LoginError error = converter.convert(response.errorBody()); 
      } 
     } 

     @Override 
     public void onComplete() { 
      // Nothing to do 
     } 
}); 
+1

ここで 'GsonConverterFactory'が必要ですか?ちょうど 'Gson'を使用してください。これは、 'errorBody()'が実際にはJSONであることを前提としています。 – CommonsWare

+0

@CommonsWareはまさに私が感謝の必要なものです。私の質問を削除する必要がありますか? – Louis

+0

自分の質問に答えることをお勧めします。そうすれば、質問とその答えが将来の他の人を助けることができます。あなたはそれが働いていることを聞いてうれしい! – CommonsWare

答えて

0

response.errorBody().toString()を使用して、JSON文字列を逆シリアル化しました。

return new Gson().fromJson(response.errorBody().string(), LoginError.class); 

これを指摘してくれたCommonsWareに感謝します。

関連する問題