Retrofit2:ClassCastException:java.util.ArrayList无法转换为retrofit2.Call

时间:2016-08-14 08:52:54

标签: java call server-side classcastexception retrofit2

请帮助Retrofit2。我是Retrofit的新手。 我创建简单的服务器应用。 应用程序管理日记帐列表:在内存列表中添加日记帐并按ID返回日记帐。 有一个Journal.java:

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

应用程序已成功启动。应用程序启动期间的控制台输出:

  

将“{[/ journal],methods = [GET]}”映射到公共改造。呼叫&gt; main.JournalControllerImpl.getJournalList()

     

将“{[/ journal],methods = [POST]}”映射到public retrofit2.Call main.JournalControllerImpl.addJournal(main.Journal)

     

映射“{[/ journal {/ id}],methods = [GET]}”on public retrofit2.Call main.JournalControllerImpl.getJournal(java.lang.Integer)

我尝试在浏览器上运行URL http://localhost:8080/journal(或GET HttpRequest http://localhost:8080/journal)。 应用程序输出中存在错误:

“... java.lang.ClassCastException:java.util.ArrayList无法转换为retrofit2.Call ......”

你能猜出出了什么问题吗? 将java.util.ArrayList转换为Call是否真的存在问题? (我已经尝试过CopyOnWriteArrayList,但这没有帮助。

提前谢谢。

3 个答案:

答案 0 :(得分:1)

Call<T>是一个只需要存在于客户端上的Retrofit类,它意味着对可能调用外部API的抽象。

我不确定您使用的是哪种类型的服务器,但是您无法转换完全不相关的类。 (例如ArrayList<T>Call<List<T>>) 通常库会为您处理序列化,因此在服务器端您只需直接返回要发送的对象:

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

答案 1 :(得分:1)

当从JournalController(和实现类JournalControllerImpl)中删除Call时,问题已得到解决。现在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);
}

完美无缺。

答案 2 :(得分:1)

使用服务接口(服务)的方法是使用回调服务(onResponse,onFailure)实现逻辑需要的细节,如下所示。

//在创建时传入构造函数    JournalController journalService;     //返回日记列表

isJumping