Android Java用Retrofit请求API填充Spinner遇注解异常求助
问题解决:Retrofit调用报错与Spinner填充优化
1. 核心错误:Retrofit接口参数缺少注解
报错No Retrofit annotation found. (parameter #1)的原因是API接口中fetchBoardList方法的username参数未绑定URL里的{username}占位符,必须用@Path注解标记该参数,让Retrofit知道如何替换URL中的占位符。
修改后的API接口代码:
@GET("/payment/fetch/board/{username}") Call<List<BoardResponse>> fetchBoardList(@Path("username") String username);
2. 冗余的JSON手动解析(会触发后续异常)
你的onResponse方法存在逻辑错误:Retrofit已经自动将响应体解析为List<BoardResponse>,不需要再把它转成字符串手动解析JSON——List.toString()的输出不是标准JSON格式,必然会抛出JSONException。直接使用解析好的列表即可。
3. 修正后的完整Retrofit调用代码
Call<List<BoardResponse>> call = RetrofitClient.getInstance().getMyApi().fetchBoardList(username); call.enqueue(new Callback<List<BoardResponse>>() { @Override public void onResponse(@NonNull Call<List<BoardResponse>> call, @NonNull Response<List<BoardResponse>> response) { if (response.isSuccessful() && response.body() != null) { List<BoardResponse> boardListFromApi = response.body(); // 提取Spinner需要的board名称列表 List<String> boardNames = new ArrayList<>(); for (BoardResponse board : boardListFromApi) { boardNames.add(board.getBoard()); } // 设置Spinner适配器 ArrayAdapter<String> spinnerArrayAdapter = new ArrayAdapter<>( PaymentEntryActivity.this, android.R.layout.simple_spinner_item, boardNames ); spinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); // 替换成你Activity中实际的Spinner实例变量,不要直接用类名Spinner yourSpinnerInstance.setAdapter(spinnerArrayAdapter); } } @Override public void onFailure(@NonNull Call<List<BoardResponse>> call, @NonNull Throwable t) { // 可添加失败处理逻辑,比如Toast提示 t.printStackTrace(); } });
额外注意事项
- 确保
BoardResponse类的字段名与API返回的JSON字段完全匹配,若字段名不一致,需用@SerializedName注解映射(例如JSON字段是board_id,类字段是boardID,需添加@SerializedName("board_id"))。 - 代码中的
yourSpinnerInstance要替换为你Activity中实际的Spinner对象,直接写Spinner.setAdapter会编译报错。
内容的提问来源于stack exchange,提问作者Raja Mali
相关产品推荐
相关产品推荐

