現在、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
}
});
ここで 'GsonConverterFactory'が必要ですか?ちょうど 'Gson'を使用してください。これは、 'errorBody()'が実際にはJSONであることを前提としています。 – CommonsWare
@CommonsWareはまさに私が感謝の必要なものです。私の質問を削除する必要がありますか? – Louis
自分の質問に答えることをお勧めします。そうすれば、質問とその答えが将来の他の人を助けることができます。あなたはそれが働いていることを聞いてうれしい! – CommonsWare