2016-08-14 13 views
3

Retrofit2で助けてください。私はRetrofitで非常に新しいです。 シンプルなサーバーアプリケーションを作成します。 アプリケーションは、ジャーナルのリストを管理します。メモリ内のリストにジャーナルを追加し、IDでジャーナルを返します。 Journal.javaがあります:Retrofit2:ClassCastException:java.util.ArrayListをretrofit2.Callにキャストできません。

public class Journal { 
private AtomicInteger getNewId = new AtomicInteger(0); 
@SerializedName("id") 
@Expose 
private Integer id; 
@SerializedName("name") 
@Expose 
private String name; 

public Journal(String name) { 
    this.id = getNewId.incrementAndGet(); 
    this.name = name;} 

public Integer getId() {return id;} 
public String getName() {return name;} 
} 

コントローラ・インタフェースがあります:

public interface JournalController { 

@GET("journal") 
Call<List<Journal>> getJournalList(); 

@GET("journal/{id}") 
Call<Journal> getJournal(@Path("id") Integer id); 

@POST("journal") 
Call<Journal> addJournal(@Body Journal journal); 
} 

これは、インターフェイスの実装です:

@Controller 
public class JournalControllerImpl implements JournalController { 
// An in-memory list that the controller uses to store the Journals 
private List<Journal> journals = new ArrayList<>(); 

@RequestMapping(value= "journal", method=RequestMethod.GET) 
public @ResponseBody Call<List<Journal>> getJournalList() { 
    return (Call<List<Journal>>) journals;} 

@RequestMapping(value= "journal/{id}", method= RequestMethod.GET) 
public @ResponseBody Call<Journal> getJournal(@Path("id") Integer id) { 
    Journal journal = journals.get(id); 
    return (Call<Journal>) journal;} 

@RequestMapping(value= "journal", method= RequestMethod.POST) 
public @ResponseBody Call<Journal> addJournal(@Body Journal journal) { 
    journals.add(journal); 
    return (Call<Journal>) journal; } 
} 

アプリケーションがsuccesesully始めました。アプリケーションの起動時にコンソール出力:マッピングされた

"{[/ジャーナル]、メソッド= [GET]}" パブリックretrofit2.Call上> main.JournalControllerImpl.getJournalList(){[/雑誌」マップ

]、メソッド= [POST]} "を公開retrofit2.Call main.JournalControllerImpl.addJournal(main.Journal)

" {[journal] /メソッド] =メソッドは[public] retrofit2にマップされました。 .Call main.JournalControllerImpl.getJournal(java.lang.Integer)

T私はブラウザでURL http://localhost:8080/journalを実行しようとします(またはGET HttpRequest http://localhost:8080/journal)。

:アプリケーションの出力にエラーがあり 「...とjava.lang.ClassCastException:java.util.ArrayListのはretrofit2.Callにキャストすることはできませんが...」

あなたは何が間違っていると思いますか? java.util.ArrayListを呼び出して変換すると本当に問題はありますか? (私はCopyOnWriteArrayListとにしようと試みてきたが、これは役立ちません。

は、事前にありがとうございます。

+0

'Journal'は、あなたのキャストが失敗した意味'コール 'ではありません。任意のメソッドから戻る前に 'Call'に' Journal'をラップする必要があります。 –

答えて

1

Call<T>オーバー抽象化であることを意味する、唯一のクライアント側に存在する必要がレトロフィットクラスであります外部APIへの潜在的な呼び出し。

私はあなたがサーバーに使用しているライブラリの種類はよく分からないが、あなたは完全に無関係なクラスをキャストすることはできません。(このようなCall<List<T>>ArrayList<T>など) 通常のライブラリはあなたのためのシリアライズを処理しますしたがって、サーバー側では、送信するオブジェクトを直接返すだけです。

@RequestMapping(value= "journal", method=RequestMethod.GET) 
public @ResponseBody List<Journal> getJournalList() { 
    return journals;} 
+0

ありがとう、Kiskae、それは今作動する! – vzateychuk

1

この問題は、CallがJournalController(および実装クラスJournalControllerImpl)から削除されたときに解決されました。今すぐJournalControllerは次のようになります。

public interface JournalController { 
String URL_PATH = "journal"; 

@GET(URL_PATH) 
List<Journal> getJournalList(); 

@GET(URL_PATH +"/{id}") 
Journal getJournal(@Path("id") Integer id); 

@POST(URL_PATH) 
Journal addJournal(@Body Journal journal); 
} 

そして、完璧に動作します。

1

サービスインターフェイス(サービス)を使用する方法は、コールバック(onResponse、onFailure)を持つサービスに対して、ロジックが必要とする詳細を以下に強調して実装します。

//作成時にコンストラクタを渡す JournalController journalService; //戻りジャーナルリスト

Call<List<Journal>> call = journalService.getJournalList(); 
call.enqueue(new Callback<>() { 
    @Override 
    public void onResponse(Call<List<Journal>> call, Response<List<Journal>> 
     response) { 
     int statusCode = response.code(); 
     List<Journal> journal = response.body(); 

    } 

    @Override 
    public void onFailure(Call<Journal> call, Throwable t) { 
     // Log error here since request failed 
    } 
}); 

//Return a journal 

Call<Journal> call = journalService.getJournal(userId); 
call.enqueue(new Callback<Journal>() { 
    @Override 
    public void onResponse(Call<Journal> call, Response<Journal> response) { 
     int statusCode = response.code(); 
     Journal journal = response.body(); 
    } 

    @Override 
    public void onFailure(Call<Journal> call, Throwable t) { 
     // Log error here since request failed 
    } 
}); 

//Add journal 

Call<Journal> call = journalService.addJournal(new Journal("username"); 
call.enqueue(new Callback<Journal>() { 
    @Override 
    public void onResponse(Call<Journal> call, Response<Journal> response) { 
     int statusCode = response.code(); 
     Journal journal = response.body(); 
    } 

    @Override 
    public void onFailure(Call<Journal> call, Throwable t) { 
     // Log error here since request failed 
    } 
}); 
関連する問題