2016-03-26 8 views
0

私は改装に新しく、私は自分のレトロフィットにカスタムエラーハンドラーを実装しようとしています。私は私のエラーハンドラでRetrofit 1.9カスタムハンドラーエラー

[ 
    { 
    "field": "username", 
    "message": "Username \"test\" has already been taken." 
    }, 
    { 
    "field": "email", 
    "message": "Email \"[email protected]\" has already been taken." 
    } 
] 

try { 
     ModelError restError = (ModelError) cause.getBodyAs(ModelError.class); 
    } 
catch (Exception ex) { 
      Log.d("custom", ""+ex.toString()); 
     } 

私のモデルは次のようになります。

public class ModelError 
{ 
    String message; 
    String field; 
} 

しかし、私はrecive:

は、私は、サーバーから次の応答をrecive

Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2 path 

は、私はエラーハンドラの聖霊降臨祭でコードを置き換える:

List<ModelError> restError = (List<ModelError>) cause.getBodyAs(ModelError.class); 

そして、まだログに同じエラーをreceving。

何が間違っていますか? おかげ

+0

gsonライブラリをjsonの解析に使用していますか? –

+0

はい私はgsonライブラリを使用します – Corneliu

答えて

0
public class ModelResponse{ 
ArrayList<ModelError> modelErrorList; 
} 

try { 
     ModelResponse modelResponse = (ModelResponse) cause.fromJson(response, ModelResponse.class); 
    } 
catch (Exception ex) { 
      Log.d("custom", ""+ex.toString()); 
     } 

私はcauseがgsonオブジェクトであると信じています。これがあなたの目標を達成するのに役立つことを願っています。

0

また、応答を処理するために、新しいクラスを追加するためにあらゆるニーズせずに次のコードを使用して、パーサーエラー応答を取得することができます:Restと仮定すると

List<ModelError> error = (List<ModelError>) cause.getBodyAs(new TypeToken<List<ModelError>>() {}.getType()); 

UPDATE

は、あなたのレトロフィットサービスあなたです

Rest rest = ...// creating rest service 
rest.requestToWebService(data, new Callback<WebServiceResponse>() { 
      @Override 
      public void success(WebServiceResponse webServiceResponse, Response response) { 
       // Do success things! 
      } 

      @Override 
      public void failure(RetrofitError error) { 
       List<ModelError> modelErrors = (List<ModelError>) error.getBodyAs(new TypeToken<List<ModelError>>() {}.getType()); 
      } 
     }); 
+0

私は問題がここにないと思います。私のエラーハンドラにログオンしている場合、 "retrofit.RetrofitError:422 Data Validation Failed"と表示されます。同じデータのPostManで私は私のポストからjsonを受け取ります。これは422エラーが発生するためですどうすればサーバーからfail jsonを見ることができますか? – Corneliu

+0

_Callback_は、要求が失敗した場合に備えて、retrofitによって結果または例外を提供するために使用しています。 Retrofitは、成功したリクエストは、HTTPステータスコードが200〜399の範囲内にあるものと仮定しています(もし私が覚えていれば)。 400を超えるものはエラー応答とみなされます。したがって、Retrofitは_Callback_クラスから_failure(RetrofitErrorエラー)_を呼び出します。この場合、上記のコードを使用できます(1分後に更新されます)。 –

+0

Log.d( "log"、 "error:" + error)の失敗時に(RetrofitErrorエラー)あなたの方法で試してみてください。 => retrofit.RetrofitError:422データ検証に失敗しました。私が郵便配達で受け取った上からのjsonの兆候はありません。何かアドバイス? – Corneliu

0

すべてのJsonオブジェクトは '{' sigで始まりますn、すべてのjson配列は '['記号で始まります。 2つのModelクラス(つまりモデルの配列)を含むものからjsonオブジェクト(つまりModelクラス)を作成しようとしているため、エラーはオブジェクトではなくエラーのリストとして解析されます