2016-08-14 2 views
3

Retrofit2로 도움을 청하십시오. 나는 Retrofit에서 매우 새롭다. 간단한 서버 응용 프로그램을 만듭니다. 응용 프로그램은 저널 목록을 관리합니다. 메모리 내 목록에 저널을 추가하고 저널을 ID별로 반환하십시오. Journal.java이있다 :Retrofit2 : ClassCastException : java.util.ArrayList를 retrofit2.cast로 호출 할 수 없습니다.

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 시작

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;} 
} 

는 컨트롤러 인터페이스가 있습니다. 응용 프로그램의 시작하는 동안 콘솔 출력 : 매핑

"{[/ 저널, 방법 = [GET]}"공공 retrofit2.Call 위에> main.JournalControllerImpl.getJournalList() 매핑

"{[/ 저널 ], 메소드 = [POST]} "public retrofit2.Call main.JournalControllerImpl.addJournal (main.Journal)

"{[journal] .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에 tryed했지만 문제가 해결되지 않습니다.

미리 감사드립니다.

+0

'Journal'가'를 호출하지 않습니다 '. 어떤 방법으로 돌아 오기 전에'Call'에'Journal'을 싸야합니다. –

답변

1

Call<T> 만 클라이언트 측에 존재해야하는 개조 클래스는, 이상 추상화로 의미 외부 API에 대한 잠재적 호출.

난 당신이 서버에 사용하는 라이브러리의 어떤 종류의 모르겠어요하지만 당신은 전혀 관계가없는 클래스를 캐스팅 수 없습니다. 보통 라이브러리가 당신을 위해 직렬화를 처리합니다 (이러한 ArrayList<T>Call<List<T>>에 관한) 따라서 서버 측에서 보내려는 객체를 직접 반환하면됩니다.

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

감사합니다, Kiskae, 이제 작동합니다! – vzateychuk

1

호출이 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 
    } 
}); 
관련 문제